grails Deadlock found when trying to get lock; try restarting transaction

参考文章:
  http://blog.csdn.net/aesop_wubo/article/details/8286215
 http://www.aichengxu.com/view/24054
 
 最近碰到在领域类中自关联时产生的死锁问题,被困扰了好几天,
 后面解决时发现太简单了,真是始料不及呀。。。


 
 // 我碰到死锁时,领域类的关键代码如下,翻开数据库day表发现自关联时生成的列为:parent_id
 class Day {
    String name
    static belongsTo = [parent: Day]
    static hasMany = [children: Day]
}




//  操作Day的服务代码简化如下
@Transactional
class DayService {
      
  // 注意:saveDay方法会被多条线程同时调用,
  // 参数day都是在各个线程中自己New出来的, 
  // 所以参数day是线程安全的         
saveDay(def day){

//  该行代码在被多条线程同时调用时,有可能会获取到同一个dayParent
//  这里就需要注意了,有可能多条线程同时操作数据库中的同一行记录
def dayParent = getParent(day.name)


// 就是下面这行代码产生了:Deadlock found when trying to get lock; try restarting transaction
// 原因:多条线程同时操作数据库中的同一行记录,在相互等待时产生了死锁
dayParent.addToChildren(dayParent)



}
           
           
Day getParent(String name) {
   def day = Day.where {
       name == name
   }.get()
   return day
}


}


------------------------------------------------------------------
解决方法:   
  
// 注意:saveDay方法会被多条线程同时调用,
       // 参数day都是在各个线程中自己New出来的, 
       // 所以参数day是线程安全的         
saveDay(def day){

//  该行代码在被多条线程同时调用时,有可能会获取到同一个dayParent
//  这里就需要注意了,有可能多条线程同时操作数据库中的同一行记录
def dayParent = getParent(day.name)


//dayParent.addToChildren(dayParent) // 注释掉该行代码
day.parent = dayParent // day都是线程安全的,这样写也可以达到类自相关的目的,而且还很可靠,何乐而不为呢。。。


}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值