Ответ
Вот основные ошибки транзакций в Go с примерами:
- Незавершенная транзакция - забыли Commit/Rollback:
tx, _ := db.Begin()
_, err := tx.Exec("INSERT...")
if err != nil {
// забыли tx.Rollback()
return err
}
// забыли tx.Commit()
- Вложенные транзакции - попытка начать новую внутри существующей:
tx, _ := db.Begin()
_, err := tx.Exec("INSERT...")
if err != nil {
tx2, _ := db.Begin() // ошибка - уже в транзакции
// ...
}
- Использование соединения после Rollback:
tx, _ := db.Begin()
tx.Rollback()
_, err := tx.Exec("INSERT...") // ошибка - транзакция уже закрыта
- Долгие транзакции - блокировка ресурсов:
tx, _ := db.Begin()
// долгие операции...
time.Sleep(30 * time.Second) // блокировка таблиц
tx.Commit()
- Необработанные ошибки:
tx, _ := db.Begin()
_, err := tx.Exec("INSERT...")
if err != nil {
log.Println(err) // просто логируем, но не откатываем
return
}
tx.Commit()