【问题标题】:Read committed and transaction Error 1213: Deadlock读取已提交和事务错误 1213:死锁
【发布时间】:2020-02-27 14:22:44
【问题描述】:

我有 MySql 5.7 和以下可能同时运行的 golang 代码:

tx := s.db.Begin()

if err := tx.Exec(fmt.Sprintf("DELETE FROM related_table WHERE id = %d " item.ID)).Error; err != nil {
    tx.Rollback()
}

// Save is ORM method, it make inserts into 'related_table' from the first query 
if err := tx.Save(&item).Error; err != nil {
    tx.Rollback()
}

我在tx.Save(&item) 期间发现错误

错误 1213:尝试获取锁时发现死锁;尝试重启事务

问题是:

mysql 事务怎么可能不受死锁保护?事务不是按顺序运行的吗?

【问题讨论】:

    标签: mysql concurrency transactions deadlock isolation-level


    【解决方案1】:

    我可以看到一些东西 "错误; err != nil { tx.Rollback()" ;所以我想这意味着失败时回滚,对吗? ;那么如果它成功了会发生什么;你必须明确提到提交吗?还是在您的设置中自动提交?

    【讨论】:

      【解决方案2】:

      select ... for update 正在对行设置排他锁,直到事务结束

      只需在事务开始时运行以下命令:

      tx.Exec("SELECT * FROM %s WHERE coupon_id = ? FOR UPDATE", item.ID))
      

      【讨论】:

        猜你喜欢
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 2019-07-11
        • 2014-07-29
        • 1970-01-01
        相关资源
        最近更新 更多