事務詳解

在軟件領域,全有或者全無的操作被稱作事務(Trancatioin)。事務允許你將幾個操作組合成一個要麼全部發生要麼全部不發生的工作單元。如果這幾個操作都順利,事務將會成功。但是如果出現有任何一個操作出錯的話,所發生的行爲將被清除乾淨(事務回滾)。


一、 事務的四個要素,也叫(ACID)

1) 原子性(Atomic)

事務是由一個或多個活動組成的一個工作單元。原子性確保了事務中的所有操作全部發生或全部不發生。如果所有的活動都成功了,事務也就成功了。如果任意一個活動失敗了,整個事務也失敗並回滾。


2) 一致性(Consistent)

一旦事務完成,系統必須確保它所建模的業務除以一致狀態。


3) 隔離性(Isolated)

事務允許多個用戶對相同的數據進行操作,每個用戶的操作不會與其他用戶糾纏在一起。因此,事務應該被彼此隔離,避免發生同步讀寫相同數據的事情(注意的是,隔離性往往涉及到鎖定數據庫中的行或表)。


4)持久性(Durable)

一但事務完成,事務的結果應該持久化,這樣就能從任何系統崩潰中恢復過來。這一般會涉及將結果存儲到數據庫或其他形式的持久化存儲中。


事務是故障恢復和併發控制的基本單位,事務的幾個特性可能遭到破壞的因素有:

a. 多個事務並行運行,不同事務的操作交叉執行;

b. 事務在運行過程中被強制停止。




二、 多個事務併發運行可能會導致的問題

1) 讀髒(Dirty Reads)

讀髒髮生在一個事務讀取了另一個事務改寫但尚未提交的數據時。如果改寫的數據稍後被回滾了,那麼第一個事務獲取的數據就是無效的。比如:事務A修改了數據庫中的數據D的值爲1000(假設原來爲800),這時候事務B讀取了D的值爲1000,但是後來事務A回滾了修改操作,那麼D的值變爲800了,那麼事務B讀取的數據是與數據庫中的不一致,是無效數據。

2) 不可重複讀(Nonrepeatabe read)

不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,但是每次都得到不同的數據時。通常是因爲另一個併發事務在兩次查詢期間更新了數據。

3) 幻讀(Phantom read)

幻讀與不可重複讀類似。它發生在一個事務A讀取了幾行數據,接着另一個併發事務B插入了一些數據時。在隨後的查詢中,第一個事務A就會發現多了一些原本不存在的記錄。

4) 丟失修改(Lost Update)

兩個事務T1和T2讀取同意數據並修改,T2提交結果破壞了T1提交的結果,導致T1的修改丟失。比如事務T1和T2讀取機票餘額爲16張,T1事務售賣一張後修改爲餘票爲15,T2事務售賣機票之後同樣修改爲15張。


三、事務隔離級別

隔離級別定義了一個事務可能受其他併發事務影響的程度。在理想的情況下,事務之間是完全隔離的,從而可以防止多個事務併發帶來的讀髒、不可重複讀、幻讀等問題。但是完全的隔離會導致性能問題,因爲通常會涉及鎖定數據庫中的記錄。這樣的鎖定會阻礙併發性,要求事務互相等待以完成各自的工作。

考慮到完全的隔離會導致性能問題,而且並不是所有的應用程序都需要完全的隔離,所以有時應用程序需要在事務隔離上有一定的靈活性,就會有不同的隔離級別。


1) java中隔離級別有如下幾種,在java的Connection中可以設置 setTransactionIsolation(int leave) 方法設置該連接的事務隔離級別:


 1、READ_COMMITTED   表示只讀別的事務提交了的數據。這樣可以防止髒數據的發生,但解決不了不可重複讀和幻讀;

 2、RRPEATABLE_READ  表示不可發生髒讀和不可重複讀, 幻讀還是可能發生。

 3 、SERIALIZABLE  表示所有的情況都不允許發生

 但是 其中等級設置的越高,效率也就越低了, 一般設置爲READ_COMMITTED  


2)spring的事務隔離級別

1、ISOLATION_DEFAULT 使用後端數據庫默認的隔離級別

2、 ISOLATION_READ_UNCOMMITTED 允許讀取尚未提交的數據變更,可能會導致讀髒、幻讀或不可重複讀

3、ISOLATION_READ_COMMITTED 允許讀取併發事務已經提交的數據,可以阻止讀髒,但是幻讀或不可重複讀仍可能發生

4、 ISOLATION_REPEATABLE_READ 對同一字段的多次讀取結果一致的,除非數據是被本事務自己所修改。可以阻止讀髒和不可重複讀,但仍可能發生幻讀

5、 ISOLATION_SERIALIZABLE 完全服從ACID的隔離級別,確保阻止讀髒、不可重複讀及幻讀。這是最慢的事務隔離級別,因爲是通過完全鎖定事務相關的數據庫表來實現的。



四、 封鎖

封鎖是實現併發控制的一個非常重要的技術。所謂封鎖就是事務T在對某個數據對象;例如表、記錄等操作之前,先向系統發出請求,對其加鎖。加鎖後事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其他的事務不能更新此數據對象。

確切的控制由封鎖的類型決定。基本的封鎖類型由兩種:排它鎖(Exclusive Locks,簡稱X鎖)和共享鎖(Share Locks,簡稱S鎖)

排他鎖又稱爲寫鎖。若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其他的任何事務不能對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能在讀取和修改A。

共享鎖又稱讀鎖。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能對其加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其他事務可以讀A,但在T釋放A上的鎖之前不能對A做任何修改。


關於事務的基本知識就說到這兒了,關於事務的配置和使用將在以後的文章中寫道。













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章