[Серверная часть #6] Простой способ реализации транзакции базы данных в Golang

YOUTUBE · 22.11.2025 04:04

Ключевые темы и таймкоды

Введение в транзакции

0:00
  • Транзакция — это единая единица работы, состоящая из нескольких операций с базой данных.
  • Пример транзакции: перевод 10 долларов с одного счёта на другой.
  • Транзакция включает создание записи о переводе, ввод средств на оба счёта, обновление балансов.

Причины использования транзакций

1:19
  • Обеспечение надёжности и согласованности данных даже при сбоях системы.
  • Изоляция между программами, обращающимися к базе данных одновременно.
  • Свойства ACID: атомарность, согласованность, изоляция, долговечность.

Запуск транзакции в SQL

2:29
  • Начало транзакции с инструкции `begin`.
  • Выполнение серии SQL-запросов.
  • Фиксация транзакции при успешном завершении всех операций.
  • Откат транзакции при неудаче любого запроса.

Реализация транзакций в Golang

3:03
  • Создание структуры хранилища для выполнения запросов и транзакций.
  • Композиция как предпочтительный способ расширения функциональности в Golang.
  • Добавление функции для создания объекта хранилища.

Функция для выполнения транзакции

5:03
  • Запуск новой транзакции с контекстом и функцией обратного вызова.
  • Создание объекта запросов с транзакцией.
  • Вызов функции обратного вызова с запросами.
  • Фиксация или откат транзакции на основе ошибки.

Пример транзакции перевода денег

7:56
  • Определение структуры параметров transfertxparams: идентификатор счёта, сумма перевода.
  • Структура результатов transfertxresult: записи о переводе, балансе, вводе средств.
  • Реализация функции обратного вызова для создания записей о переводе и обновлении балансов.

Создание записей о переводе и балансе

10:02
  • Вызов функции `q.gridtransfer` для создания записи о переводе.
  • Проверка ошибки и возврат её при необходимости.
  • Создание записей о вводе средств на оба счёта.

Завершение транзакции

11:41
  • Обновление балансов счетов.
  • Упоминание о сложности обновления балансов и необходимости блокировки для предотвращения взаимоблокировок.
  • Обещание вернуться к реализации обновления балансов в следующем видео.

Создание нового теста для магазина

12:20
  • Создаём новый модульный тест для функции передачи текста.
  • Определяем новый объект магазина и требуем объект базы данных SQL.

Подготовка к тестированию

12:44
  • Объявляем глобальную переменную testdb для хранения результата SQL-запроса.
  • Изменяем переменную подключения на testdb при создании объекта тестовых запросов.

Тестирование транзакций

13:49
  • Запускаем n параллельных транзакций перевода с помощью цикла for и ключевого слова go.
  • Внутри процедуры go вызываем команду store.transfertx с фоновым контекстом и объектом transfertxparam.

Проверка ошибок и результатов

14:54
  • Используем каналы для безопасного обмена данными между параллельными программами.
  • Отправляем сообщения об ошибках и результаты в каналы error и results соответственно.

Проверка результатов транзакций

16:09
  • Получаем сообщения об ошибках и результаты из каналов.
  • Проверяем, что объект переноса не пуст, а поля идентификаторов и сумм соответствуют ожиданиям.

Проверка записей в базе данных

17:16
  • Вызываем store.gettransfer для проверки существования записи о передаче.
  • Проверяем записи в учётной записи, связанные с результатом транзакции.

Завершение теста

18:58
  • Добавляем комментарий о необходимости проверки баланса счёта.
  • Проводим тест всего пакета, который проходит успешно с охватом около 80%.
  • Завершаем лекцию, предлагая попробовать обновить баланс счёта самостоятельно.