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 }