在hibernate.cfg.xml配置程序里的默认事务并发处理级别:
<property name="connection.isolation">2</property>
为了考虑并发的效率,推荐使用级别2(TRANSACTION_READ_UNCOMMITTED),但是存在重复读问题(non-reapeatable reads)和幻读(phantom reads)问题。
在Hibernate中为了解决重复读问题(non-reapeatable reads)问题,可以使用悲观锁、乐观锁两种方法来解决。
用悲观锁解决 repeatable read 的问题(依赖于数据库的锁)
LOCKMODE.UPGRADE
悲观锁
使用数据库的锁,如:
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)
乐观锁
程序员自己加字段,来记录版本信息,当事务1查询数据后,事务2对数据产生变化时,版本号自动加1,当事务1提交事务时会检测版本号是否一致,如果不一致则报错。效率要比悲观锁高。