Row was updated or deleted by another transaction 异常原因及处理

org.hibernate.StaleObjectStateException:
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.xx.xx:11]

说明操作的对象时应用了乐观锁机制,或者定义pojo时定义了version字段;或者同时对同一对象(同一ID)进行了操作

场景1:

 

乐观锁和悲观锁基本概念

在数据库并发操作时,为了保证数据的正确性,我们会做一些并发处理,主要就是加锁。

在加锁的选择上,有几种方式,悲观锁乐观锁

  • 悲观锁,简单的理解就是:把需要的数据全部加锁,在事务提交之前,这些数据全部不可读取和修改。
  • 乐观锁,使用对数据进行版本校验和比较,来对保证本次的更新时最新的,否则就失败。

因此在乐观锁下,当对同一版本对象进行更新操作或类似操作会抛出异常,提示该行已经被其他事务删除或者修改过了,本次修改无法生效,这样就保证了数据的一致性。


解决:

  1. 每次用form提交数据时,把version也一并提交上来,commit提交事务;
  2. 从数据库中把version查出来,赋给实体对象,再更新;

 


参考来源于:

http://how2j.cn/k/hibernate/hibernate-optimistic-lock/101.html#nowhere

https://blog.csdn.net/baungham/article/details/7228471

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值