事务并发处理:
a)事务:ACID(事务的四个特性)
i.Atomic(原子性)、Consistency(一致性)、Itegrity(独立性)、Durability(持久性)
A:要么全部执行,要么不执行。
C:事务的运行不该变数据库中数据的一致性。
I:两个以上的事务不会出现交错执行的状态。
D:事务运行以后,系统的更新是永久的,不会无缘无故的回滚。
b)事务并发时可能出现的问题(参考孙卫琴的表)
1.第一类丢失更新(Lost Update)
2.脏读(duty read)
3.不可重复读(non-repeatable read)
4.第二类丢失更新(second lost update problem)
5.幻读(phantom read)重点说的是插入删除的操作
数据库的隔离机制:
不让它并发,在一定的时候处理它并发的问题,隔离它们,不让它们相互影响。
有四种隔离机制:(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.用悲观锁、乐观锁