天天看點

【hibernate架構】使用hibernate實作悲觀鎖和樂觀鎖

四種隔離機制不要忘記:(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