读取已提交和事务错误 1213:死锁
Read committed and transaction Error 1213: Deadlock
我有 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)
期间发现错误
Error 1213: Deadlock found when trying to get lock; try restarting transaction
问题是:
mysql 事务怎么可能没有防止死锁?不按顺序交易 运行 吗?
我能看到一些东西"Error; err != nil { tx.Rollback()";所以我想这意味着失败时回滚,对吧? ;那么如果它成功了会发生什么;你必须明确提到承诺吗?或者它在你的设置中自动提交?
select ... for update
正在对行设置独占锁直到事务结束
刚运行交易开始时跟进:
tx.Exec("SELECT * FROM %s WHERE coupon_id = ? FOR UPDATE", item.ID))
我有 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)
Error 1213: Deadlock found when trying to get lock; try restarting transaction
问题是:
mysql 事务怎么可能没有防止死锁?不按顺序交易 运行 吗?
我能看到一些东西"Error; err != nil { tx.Rollback()";所以我想这意味着失败时回滚,对吧? ;那么如果它成功了会发生什么;你必须明确提到承诺吗?或者它在你的设置中自动提交?
select ... for update
正在对行设置独占锁直到事务结束
刚运行交易开始时跟进:
tx.Exec("SELECT * FROM %s WHERE coupon_id = ? FOR UPDATE", item.ID))