SQL: зачем нужна транзакция для бронирования билетов? - PullRequest
0 голосов
/ 06 октября 2019

Я прочитал, что транзакция обычно используется на веб-сайте бронирования билетов в кино, чтобы решить проблему одновременной покупки. Однако я не смог понять, почему это необходимо.

Если в то же время 2 пользователя бронируют один и тот же seat (ID = 1) на одном и том же show (ID = 99), разве вы не можете просто выполнить следующую команду SQL?

UPDATE seat_db
SET takenByUserID=someUserId
WHERE showID=99 AND seatID=1 AND takenByUserID IS NOT NULL

Как я вижу, этот SQL уже был выполнен атомарно, проблем с параллелизмом нет. База данных установит для seat ID=1 1-го пользователя, от которого сервер получит запрос, а затем допустит сбой запроса 2-го пользователя. Итак, почему транзакция по-прежнему необходима для системы бронирования билетов?

Ответы [ 2 ]

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

Вам придется использовать транзакции, если в вашем действии несколько несвязанных строк. Например, если пользователь должен заплатить за билет, то будет как минимум два обновления: обновить кредит пользователя и пометить место как занятое. Если какое-либо из двух обновлений было выполнено в одиночку, у вас наверняка возникнут проблемы.

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

Когда вы объединяете все свои операторы DML в одну транзакцию, обычно вы сообщаете базе данных несколько вещей:

  1. Делайте эту операцию (т. Е. Бронируйте билет в кино) полностью илиоперация «ничего» * ​​1005 *
  2. Убедитесь, что вы не оставили никаких строк-сирот и у вас есть согласованные данные
  3. Заблокируйте все связанные таблицы заранее, чтобы никакие другие записи не могли быть выполнены, покаоперация выполняется
    • Запрещает другим транзакциям изменять таблицы, к которым ваша текущая операция хочет получить доступ
    • Предотвращает взаимоблокировку и позволяет продолжить обработку, отменив один из блокирующих запросов

Требуется ли обернуть запрос UPDATE seat_db в свою собственную транзакцию, зависит от того, какая другая обработка (DML) выполняется до и после нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...