读取已提交和事务错误 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))