墨染丶

导航

Transactional 事务 锁机制

问题代码:

 1 @Transactional  //声明式事务
 2 def stop(Long id) {
 3   .......
 4   // M5系列去停止充电
 5   pileJmsService.stopCharge(chargePile, chargeRecord.port, chargeRecord)
 6   // 停止充电后续处理
 7   def lockNames = LockNames.stop(chargePile.id, chargeRecord.port)
 8   syncLock.lock(lockNames)
 9   try {
10       chargeDoneService.processChargeDone(chargeRecord.id, ChargeDone.STATUS__MANUALLY, 0)
11   } finally {
12       syncLock.release(lockNames)
13   }
14 }
问题:  事务隔离级别为(串行化)
syncLock.lock() 加的锁在 事务范围之内, 导致 解锁过后 该事物在还未提交的过程中 ,新的线程在极短时间内 走同样的 方法, 但因为事务未提交 所以查询的方法是 数据未提交前 的数据,
导致查询数据的状态判断未通过, 从而引发运行时执行2次方法 而抛出异常

解决方法: grails框架 添加一个新的事务
ChargeRecord.withNewTransaction {  //编程式事务
  
}

更改后代码:
 1 def lockName = LockNames.stop(chargePile.id, chargeRecord.port)
 2 syncLock.lock(lockName)
 3 try {
 4     ChargeRecord.withNewTransaction {
 5         // M5系列去停止充电
 6         pileJmsService.stopCharge(chargePile, chargeRecord.port, chargeRecord)
 7         // 停止充电后续处理
 8         chargeDoneService.processChargeDone(chargeRecord.id, ChargeDone.STATUS__MANUALLY, 0)
 9         log.info("订单[${chargeRecord.id}, lock: ${lockName}]结束处理完成")
10     }
11 } finally {
12     syncLock.release(lockName)
13 }

 

posted on 2020-05-12 19:06  墨染丶  阅读(715)  评论(0编辑  收藏  举报