码迷,mamicode.com
首页 > 其他好文 > 详细

Transactional 事务 锁机制

时间:2020-05-12 20:12:34      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:long   执行   color   status   事务   通过   提交   log   cloc   

问题代码:

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

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


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

Transactional 事务 锁机制

标签:long   执行   color   status   事务   通过   提交   log   cloc   

原文地址:https://www.cnblogs.com/guoleidd/p/12878076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!