事务隔离机制(尚学堂)
事务的四个特性:ACID
Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)
事务并发时可能出现的问题:
第一类丢失更新(Lost Update) (可以忽略)
脏读(dirty read)
不可重复读(non-repeatable read)
第二类丢失更新(second lost update problem)(不可重复读的特殊情况)
幻读(phantom read)
为了解决上述问题,数据库提供了四种事务隔离机制
1、read-uncommitted 会出现dirty read,phantom-read,non-repeatable read
2、read-committed 不会出现dirty read,因为只有另一个事务提交才会读出结果,但仍然 会出现non-repeatable read和phantom read。
4、repeatable read
8、serializable 不会出现任何问题
设定hibernate的事务隔离级别
1、hibernate.connection.isolation=2 为了考虑效率问题一般设置成2
2、用悲观锁解决repeatable read问题(依赖于数据库的锁)
1) select ... for update
2) load(xx.class,i,LockMode.Upgrade)
a) LockMode.None 无锁,Transaction结束时,自动切换到此模式
b) LockMode.read 在查询的时候 hibernate会自动获取锁
c) LockMode.write insert update hibernate会自动取消锁
d) 以上3种锁的模式,是hibernate内部使用的
3、Hibernate[JPA] 乐观锁定(ReadCommitted)
1) @Version 乐观锁使用版本控制