C 中的事務處理

2021-06-21 09:51:31 字數 2210 閱讀 3768

sqlconnection myconnection = new sqlconnection("data source=localhost;initial catalog=northwind;integrated security=sspi;");

myconnection.open();

sqltransaction mytrans = myconnection.begintransaction(); //使用new新生成乙個事務

sqlcommand mycommand = new sqlcommand();

mycommand.transaction = mytrans;

trycatch(exception e)

finally

需要注意的是,如果使用oledb類而不是sqlclient類來定義sql命令和連線,我們就必須使用oletransation來定義事務。

資料庫系統程式設計師需要比一般應用軟體程式設計師懂得更多。一般程式設計師對事務處理的理解不夠全面。事務處理的關鍵是在提交事務或者取消事務時,萬一系統崩潰了,資料庫在再次啟動時,仍然需要保持資料可邏輯一致性。

最簡單的事務處理過程如下:

1. 開始乙個事務。進入「事務待命」狀態。

2. 在「事務待命」狀態,記錄事務中改變的資料庫記錄。此改變不能直接改變資料庫中的值,必須先用乙個順序的「事務日誌」記錄在一邊。同時,對於要改變的原始記錄加鎖,讓其它使用者無法讀和寫。(考慮銀行取款問題,可以發現如果此時兩個使用者都在對同一帳號取數,然後減去一定金額,在先後寫回資料庫,銀行就虧錢了)。如果記錄已經被其它事務加鎖,則報錯;同一事務中卻可以重複加鎖。

3. 在「事務待命」,如果使用者給出commit transaction命令,則進入「事務拷貝」狀態,拷貝所有加鎖的記錄成備份。

4. 上面3執行完,則進入「事務更新」狀態,用「事務日誌」中記錄一一更新實際的資料庫記錄。

5. 上面4執行完,則進入「事務結束」狀態,釋放所有的記錄鎖,然後拋棄「事務日誌」和備份的原資料庫記錄。

6. 上面5做完後,事務被刪除。

但是,最為關鍵的是,事務系統必須執行以下過程:一但資料庫由於軟體、硬體問題發生故障,重啟動後,一旦有事務沒正常刪除,則:

7. 如果在「事務待命」、「事務結束」狀態,則重新從5中結束事務的動作開始執行。

8. 如果在「事務更新」狀態,則重新從4開始更新記錄,並繼續想下執行。結果,雖然系統崩潰過,但事務仍然能正常提交。

informix、oracle、db2等資料庫的實際事務處理流程更複雜,目的是具有更好的抵抗系統錯誤性質,因為事務保護是業務系統安全穩定的最後一道防線(比用2個cpu、熱備份等更重要。因為那些方法對已經混亂錯誤的資料照樣保護,結果經常造成更多問題)。由於事務處理的流程比一般程式想像得複雜,因此可能會感到用起來比較繁瑣。但是了解事務在保護資料庫方面的良苦用心,就可以更好地設計出更靈活的業務流程。

如果「乙個完整的事務可能包括a,b,c,d四個小事務」就比較奇怪。既然是個過程構成乙個事務,沒必要中間在劃分為4個小事務,問為中間任何操作出錯都需要整個「回滾」到a之前。在執行完a後用乙個if語句判斷要不要再執行「b,c,d」就行,end if之後提交事務。

應用中包含的事務應當盡量讓它「瞬間」完成,避免在比較忙時造成使用者程序的互鎖。事務比較頻繁的系統,一秒鐘有幾個使用者互鎖就可能造成嚴重問題,因為事務是以乙個穩定的頻率來的,而伺服器上互鎖的程序越積越多,幾個小時後,可能有上百臺機器都死掉了,只能一台一台地重新開機,花費很多時間、金錢,還會被使用者罵死!

但是並不是說事務之間就不能有使用者互動。可以在使用者3分鐘還沒確認後,就自動報告錯誤,並且取消事務。不過我從不冒這個險,而是使用下面方法。

將事務拆分成兩段,需要非常深入地研究使用者業務流程,研究使用者在發現業務資料不一致時是如何糾正的,並且繼承使用者手工操作流程。這樣,軟體分析的工作量相應加大了。有時,這是必然的,應當說服使用者接受這種現象,並且與開發者一起逐步解決。

比如,賣彩票的交易,使用者輸入彩票號碼,此時在pos機列印彩票並且記賬。這並不需要在賣彩票時與後台伺服器實時聯網,只要每隔10分鐘上傳一次資料就行了。只有這樣,才能在現有的硬體和網路條件下使得彩票銷售開展起來。如果開發者固守者彩票號碼錄入、伺服器記賬、前台列印合併為乙個事務的天真想法,其產品一定會在激烈的市場中敗陣。

當然,隨著硬體、軟體、網路的不斷變化,如何靈活應用事務的方法會不斷變化,沒有一定的規矩,關鍵要看軟體的效果。雖然大的事務可能不斷拆分成小的事務,中間用業務流程聯絡起來;同時,合併一些小的事務或者由計算機自動處理業務資料不一致問題,從而給使用者提供網路上的「傻瓜相機」一樣的易用、穩定的產品仍然是今天最有挑戰意義的軟體工程目標。 

C 中的事務處理

一般的資料庫事務控制要求事務裡所做的操作必須在同乙個資料庫內,這樣在出現錯誤的時候才能回滾 rllback 到初始狀態。這就存在乙個問題,在分布式應用程式中,往往需要同時操作多個資料庫,使用資料庫本身的事務處理,很難滿足程式對事務控制的要求。在com 中,提供了完整的事務服務,可以利用它來完成在分布...

PHP MYSQLI中事務處理

mysql事務處理讓所有sql語句執行成功後才去處理,如果有一條沒有成功或者報錯就會回滾事務,防止敏感操作處理失敗。mysql中只有innodb和bdb型別的資料表才能支援事務處理!其它型別是不支援的!mysqli autocommit false 關閉自動提交功能 sql update users...

PHP MYSQLI中事務處理

mysql事務處理讓所有sql語句執行成功後才去處理,如果有一條沒有成功或者報錯就會回滾事務,防止敏感操作處理失敗。mysql中只有innodb和bdb型別的資料表才能支援事務處理!其它型別是不支援的!mysqli autocommit false 關閉自動提交功能 sql update users...