Выполнено чтение и транзакция Ошибка 1213: тупик - PullRequest
0 голосов
/ 01 ноября 2019

У меня 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 не защищена от взаимоблокировок? Не выполняются ли транзакции последовательно?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

select ... for update устанавливает эксклюзивные блокировки строк до конца транзакции

Просто выполните следующее в начале транзакции:

tx.Exec("SELECT * FROM %s WHERE coupon_id = ? FOR UPDATE", item.ID))
0 голосов
/ 01 ноября 2019

я вижу что-то "Ошибка; err! = Nil {tx.Rollback ()";так что я предполагаю, что это означает откат при неудаче, верно? и что произойдет, если это удастся;Вы должны упомянуть совершить явно;или его автокоммит в твоих настройках?

...