首先先回顧下事務的四大特性:
1、原子性:事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼均不執行。
2、一致性:幾個並行執行的事務,其執行結果必須與按某一順序序列執行的結果相一致。例子:乙個人搬100塊磚到a地點,是100塊。五個搬100塊到a還是100塊。
3、隔離性:事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的。
4、永續性:對於任意已提交事務,系統必須保證該事務對資料庫的改變不被丟失,即使資料庫出現故障。
事務的併發問題:
多個事務對資料庫的併發操作,可能會破壞事務的隔離性與一致性。由於併發訪問而引發的這樣的問題稱為事務的併發問題。可能引發的併發問題主要包括三類:髒讀、不可重複讀和丟失修改。
(1)髒讀:a事務讀取了b事務未提交的資料。
說明:對於事務隔離級別設定較低的資料庫,使用者對資料庫的任何修改,都是會直接寫入到資料庫中的。但是,即使寫入到資料庫,若事務回滾,也是可以再將資料恢復為原資料。
所以可能發生髒讀現象:a事務修改了某資料,雖未提交,但已寫入到資料庫。此時,b事務讀取了改資料。然後a事務又發生了回滾。那麼,b事務讀取到的就是個「不存在」的髒資料。
(2)不可重複讀有三種情況
a)事務a讀取了某一資料後,事務b對其做了修改,當事務a再次讀取該資料時,得到與前一次不同的值。:修改
b)事務a按一定條件從資料庫中讀取某資料記錄後,事務b刪除了其中部分記錄,當a再次按相同條件讀取資料時,發現某些記錄神秘地消失了。:刪除
c)事務a按一定條件從資料庫中讀取某資料記錄後,事務b插入了一些記錄,當a再次按相同條件讀取資料時,發現多了一些記錄。
後兩種不可重複讀,也稱為幻影現象
(3)丟失修改
兩個事務a與b,讀入同一資料並修改,b提交的結果破壞了a提交的結果,導致a的修改丟失。
(4)幻讀與幻影現象不是一回事兒
也稱為「虛讀」。這個問題是現實存在的由於對資料庫的併發訪問所引發的問題。
幻讀是指,同一事務中,雖然多次執行相同的查詢,查詢結果是相同的。但後面的查詢結果已經與db中真正的資料不一致了。在同一事物中多次讀取的資料,不是真實的db中當前資料,是虛的資料,就想db中資料的幻象。
例如:將資料放入快取中,第一次從資料庫查,後面從快取中查。資料庫修改了,但未與快取同步。
由於設定了隔離級別,允許可重複讀造成的。虛讀可能更合適,因為讀的是快取的資料。
2、事務的隔離級別
隔離級別是為了事務的併發問題。
· 標準的sql定義了四個隔離級別。級別由低到高分別為:讀取未提交、讀取已提交、可重複讀、序列化。隨著隔離級別的提高,其防止併發的效果也是逐步提高,但其系統開銷也是逐步提高的,**的執行效率逐步降低的。
封鎖機制
事務的隔離級別,是dbms隱式的為資料新增了鎖。其底層實際上是在乙個事務操作乙個資料時,為該資料加了一把鎖。只有該資料上所有的鎖釋放掉後,其他事務才可操作該資料。但這個操作僅指修改、刪除,不包括查詢,當然,出了序列化級別是表新增的表級鎖外,其它隔離級別鎖新增的鎖均為行鎖。
鎖機制:分為樂觀鎖和悲觀鎖
(1)樂觀鎖:每次訪問資料庫都樂觀的認為其他事務此時肯定不會同時修改該資料。在真正修改時,會在**中通過對鎖的狀態判斷來判斷資料是否被其他事務修改過,是在**中完成的,所以樂觀鎖是加在**中的。
(2)悲觀鎖:每次訪問資料時,都會悲觀的認為其他事務一定會同時修改該資料。所以,其在訪問資料時,在資料庫中就會先給資料加鎖。以防止其他事務同時修改該資料。所以鎖是加在資料庫中的。
樂觀鎖實現原理:一般充當樂觀鎖的資料有兩類:版本號與時間戳。它們的工作原理是相同的。
會在從db中讀取資料時同時讀出乙個資料版本號。當a事務將修改過的資料寫入到db中時,會使版本號增加1.當b事務發生回滾或覆蓋時,會首先對比自己資料的版本號與db中資料的版本號。若相等,則說明db中的資料沒有發生變化,可修改或回滾到原始狀態。若自己的版本號小於db中的版本號,則說明其它事務已經修改過該資料,將跑出異常無法修改。
悲觀鎖:又分為兩種:排他鎖,x鎖。寫鎖:共享鎖,也稱為s鎖,讀鎖。
悲觀鎖是行鎖,若要為表中的記錄新增行鎖,則需要通過執行查詢語句來為符合條件的記錄新增指定的鎖。
在查詢語句後新增for update,則會為每一條符合條件的記錄新增寫鎖。例如:select * from student where id in(1,2,3) for update ;會為id為1或2或3的記錄新增寫鎖。
此時其他事務可以修改這三個id以外的其他記錄資料,可以檢視所有記錄資料,但不能修改id為1/2/3的記錄資料,也不能再為這些資料新增其他型別的鎖。
在查詢語句後新增lock in share mode,則會為每乙個符合條件的記錄新增讀鎖。 select * from student where id in(1,2,3) lock in share mode。目的只有乙個防止其他事務對這個資料加寫鎖,因為加上寫鎖後別人就可以修改了。我讀取到的就不是最新的資料了。
3、hibernate如何解決併發問題
hibernate建議設定隔離級別為4級,即可重複讀。
樂觀鎖如何實現在xml配置檔案中新增vesion
實現悲觀鎖bean類的定義中不用增加任何屬性。只需要在通過get()載入物件時,為其加鎖。使用的get()方法原型為:
新增了寫鎖別人就無法修改。資料庫中的該記錄以及無法修改了。
hibernate事務簡介
資料庫的事務如果控制不好,很容易導致資料出現髒讀,不可重複讀,幻讀,這樣就會造成資料的混亂,那怎麼弄呢?利用資料庫事務的隔離級別進行控制就可以了 hibernate隔離級別有 1 read uncommitted isolation 2 read committed isolation 4 repe...
hibernate 事務機制
資料庫事務的定義 事務是指一組相互信賴的操作行為。這些操作要麼必須全部成功,要麼必須全部失敗,以保證資料的一致性和完整性。資料庫事務是對現實生活中事務的模擬,它由一組在業務邏輯上相互信賴的sql語句組成。資料庫事務的acid屬性 原子性 atomic 指整個資料庫事務是不可分割的工作單元。原子性確保...
HIbernate 事務特性
1.原子性 atomicity 事務的原子性是指事務中包含的所有操作要麼全做,要麼全不做 all or none 2.一致性 consistency 在事務開始以前,資料庫處於一致性的狀態,事務結束後,資料庫也必須處於一致性狀態。拿銀行轉賬來說,一致性要求事務的執行不應改變a b 兩個賬戶的金額總和...