hibernate中事务并发处理机制

2019-04-15 14:02发布

[size=large]1,事物并发时可能出现的问题:[/size]
[img]http://dl.iteye.com/upload/picture/pic/74522/d97ab186-c195-330a-aacf-4614305cf8aa.jpg[/img]
[img]http://dl.iteye.com/upload/picture/pic/74520/8a48cb22-70a6-352c-aa47-de8c48b6e209.jpg[/img]
[img]http://dl.iteye.com/upload/picture/pic/74518/c43bc288-6733-313f-9364-57a5aef96c86.jpg[/img]
[img]http://dl.iteye.com/upload/picture/pic/74516/52cec980-7f9b-3ef9-8169-be83677f8d18.jpg[/img]
[img]http://dl.iteye.com/upload/picture/pic/74514/f2ef4a06-1b81-375b-bc0c-2a3bad4081dd.jpg[/img]
[size=large]2.数据库有自身的事务隔离机制[/size]:有4种分别是
Read-uncommited在没提交之前也可以去读,但仍会出现dirty read,non-repeatable read,phantom read。
Read-commited提交之后才可以去读,但仍会出现non-repeatable read,phantom read。
Repeatable read当某条记录正在被使用时,会将它锁住,其它线程必须等它commit之后才可使用,可以有效避免各类事务并发问题。
Serializable按顺序挨个执行,可以有效避免各类事务并发问题,但严重影响效率。

[color=red]Mysql[/color]默认的是repeatable read(查询方式select @@tx_isolation),如果想使效率提高可以使用read-commited,然后用hibernate去解决non-repeatable read等问题。
Hibernate提供了悲观锁和乐观锁来防止事务并发导致的错误
悲观锁:使用方式是在load(xx.class,i,LockMode.Upgrade)
a) LockMode.None表示无锁的机制,Transaction结束时,切换到此模式
b) LockMode.read在查询的时候hibernate会自动获取锁
c) LockMode.wrie在insert update时hibernate会自动获取锁
这三种锁都是由hibernate自行完成的,我们只需要写LockMode.Upgrade表示支持hibernate锁的方式即可。
乐观锁:在表中增加一个字段,如果是使用annotation方式则在该字段的getter方法上加@version,如果是使用xml则加入当出现事务并发错误时系统会提示错误,如
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.Account#1]