事务并发处理:


a)事务:ACID(事务的四个特性)


   i.Atomic(原子性)、Consistency(一致性)、Itegrity(独立性)、Durability(持久性)


A:要么全部执行,要么不执行。


C:事务的运行不该变数据库中数据的一致性。


I:两个以上的事务不会出现交错执行的状态。


D:事务运行以后,系统的更新是永久的,不会无缘无故的回滚。




b)事务并发时可能出现的问题(参考孙卫琴的表)


1.第一类丢失更新(Lost Update)


【hibernate框架】事务并发处理_数据库




2.脏读(duty read)


【hibernate框架】事务并发处理_乐观锁_02




3.不可重复读(non-repeatable read)


【hibernate框架】事务并发处理_hibernate_03



4.第二类丢失更新(second lost update problem)


【hibernate框架】事务并发处理_数据库_04



5.幻读(phantom read)重点说的是插入删除的操作


【hibernate框架】事务并发处理_乐观锁_05




数据库的隔离机制:


不让它并发,在一定的时候处理它并发的问题,隔离它们,不让它们相互影响。


有四种隔离机制:(1.2.4.8)


1.read-uncommitted:能够去读那些没有提交的数据(允许脏读的存在)


2.read-committed:不会出现脏读,因为只有另一个事务提交才会读取来


结果,但仍然会出现不可重复读和幻读现象。


4.repeatable read:MySQL默认。可重复读,读数据读出来之后给它加把锁,


其他人先别更新,等我用完了你再更新。你的事务没完,其他事务就不可能改这条记录。


8.serializable:序列化,最高级别。一个一个来,不去并发。效率最低。


每一种数据库支持的隔离机制不一样(但大致少不了这四种)


设立级别的时候,一般会设立为2,避免脏读,并发性好。




查询数据库隔离机制的语句:select @@tx_isolation




对于hibernate,要想处理多个事务之间的并发,也得去设定事务的隔离级别。


也是上面4种。


设定hibernate的事务隔离级别


1.hibernate.connection.isolation=2(值是1,2,4,8)

2.用悲观锁、乐观锁