hibernate乐观锁异常问题、JMS消息数据异常问题
一、hibernate乐观锁异常问题
- 问题原因:更新产生的问题,先查询,后更新,并发会导致乐观锁异常。因为每次提交事务,hibernate version会+1,后提交的会异常。
- 业务场景:
- 不同事务(同一业务并发):查询出同一实体,设置值后保存;后保存的异常
- 例如:多个操作处理同一用户的订单,操作钱包
- 不同事务(不同业务)
- 例如:发送多个JMS消息,各JMS消息更新(不同事务)了同一实体(查询后保存)
- 例如:验货称重操作钱包,财务充值操作钱包
- 同一事务:hql语句更新,version +1 ;导致之前查询出来的实体保存异常
- 不同事务(同一业务并发):查询出同一实体,设置值后保存;后保存的异常
- 处理方案:
- 方案一:所有涉及并发的地方使用hql更新数据库,不先查询后保存(单独更新某些字段、增量更新等)
- 方案二:同一实体操作,加锁
- 其他方案:待补充
二、JMS消息处理数据异常
- 问题原因:JMS处理消息时,需要使用发送消息前处理的数据;而前一个处理事务尚未提交,JMS已经在处理了
- 业务场景:
- 例如:验货称重更新订单操作id,JMS消息需要使用操作id
- 处理方案:事务提交后发送消息
-
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { //发送消息 } });
-