Приведи примеры ошибок транзакций

«Приведи примеры ошибок транзакций» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Вот основные ошибки транзакций в Go с примерами:

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