hibernate乐观锁异常问题、JMS消息数据异常问题

2020年4月20日 作者 kee

一、hibernate乐观锁异常问题

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

二、JMS消息处理数据异常

  1. 问题原因:JMS处理消息时,需要使用发送消息前处理的数据;而前一个处理事务尚未提交,JMS已经在处理了
  2.  业务场景:
    1. 例如:验货称重更新订单操作id,JMS消息需要使用操作id
  3. 处理方案:事务提交后发送消息
    1. TransactionSynchronizationManager.registerSynchronization(new 
          TransactionSynchronizationAdapter() {
                  @Override
                  public void afterCommit() {
                      //发送消息
                  }
          });