四種隔離機制不要忘記:(1,2,4,8)
1.read-uncommitted:能夠去讀那些沒有送出的資料(允許髒讀的存在)
2.read-committed:不會出現髒讀,因為隻有另一個事務送出才會讀取來
結果,但仍然會出現不可重複讀和幻讀現象。
4.repeatable read:mysql預設。可重複讀,讀資料讀出來之後給它加把鎖,
其他人先别更新,等我用完了你再更新。你的事務沒完,其他事務就不可能改這條記錄。
8.serializable:序列化,最進階别。一個一個來,不去并發。效率最低。
hibernate的隔離機制
i.hibernate.connection.isolation=2
ii.用悲觀鎖解決:repeatable read的問題(依賴于資料庫的鎖)
a)lockmode.none 無鎖的機制,transaction結束時,切換到此模式
b)lockmode.read 在查詢的時候 hibernate會自動擷取鎖
c)lockmode.write insert update hibernate會自動擷取鎖
d)以上3中鎖的模式,是hibernate内部使用的
e)lockmode.upgrade_nowait oracle支援的鎖的方式
例子:
account.java:
hibernate.cfg.xml中配置:
測試:
這是依賴于資料庫的鎖的,也就是給資料庫一個指令,要求資料庫幫忙加鎖。
——————————————————————————————————————
iii.hibernate(jpa)樂觀鎖定(readcommitted)
這不是依賴資料庫加鎖的,是在程式中加鎖的。
舉個例子:一個資料需要隔離機制(不能重複讀),這個時候在更新的字段上加"版本号"(version字段),一旦有人給它update一下,這個值就加1(version+1)。
那麼這種機制是如何産生隔離能力的呢?
原因是事務a讀取字段的同時,事務b緊接着也讀取這個字段,而且改了它,此時version變成1了。這個時候事務a就會檢查字段是否被改變了,如果被改變它也做相應的改變,沒有改變就不改。
樂觀鎖的實作:(@version)
悲觀樂觀的差別:悲觀鎖認為一定會受到影響,我加鎖誰也别想動。
樂觀鎖,沒出事就好,出了事我再想辦法解決。
轉載請注明出處:http://blog.csdn.net/acmman/article/details/44176281