在hibernate.cfg.xml配置程序里的默認(rèn)事務(wù)并發(fā)處理級(jí)別:
<property name="connection.isolation">2</property>
為了考慮并發(fā)的效率,推薦使用級(jí)別2(TRANSACTION_READ_UNCOMMITTED),但是存在重復(fù)讀問(wèn)題(non-reapeatable reads)和幻讀(phantom reads)問(wèn)題。
在Hibernate中為了解決重復(fù)讀問(wèn)題(non-reapeatable reads)問(wèn)題,可以使用悲觀鎖、樂(lè)觀鎖兩種方法來(lái)解決。
用悲觀鎖解決 repeatable read 的問(wèn)題(依賴于數(shù)據(jù)庫(kù)的鎖)
LOCKMODE.UPGRADE
悲觀鎖
使用數(shù)據(jù)庫(kù)的鎖,如:
select * from test for update(Oracle)
/////////////////////////////////////
select
account0_.id as id0_0_,
account0_.balance as balance0_0_
from
Account account0_ with (updlock,
rowlock)
where
account0_.id=?
(SQL SERVER)
樂(lè)觀鎖
程序員自己加字段,來(lái)記錄版本信息,當(dāng)事務(wù)1查詢數(shù)據(jù)后,事務(wù)2對(duì)數(shù)據(jù)產(chǎn)生變化時(shí),版本號(hào)自動(dòng)加1,當(dāng)事務(wù)1提交事務(wù)時(shí)會(huì)檢測(cè)版本號(hào)是否一致,如果不一致則報(bào)錯(cuò)。效率要比悲觀鎖高。