hibernate中事务并发处理机制

[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则加入<version name="version"></version>当出现事务并发错误时系统会提示错误,如
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.Account#1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值