Нужна ли нам блокировка уровня записи, когда у нас уже есть Транзакция для онлайн-заказа? (концертного билета или бронирования авиабилетов) - PullRequest
1 голос
/ 25 апреля 2010

Для онлайн-заказа концертных мест или авиабилетов нам нужна блокировка уровня записи или транзакция достаточно хороша?

Для билета на концерт (скажем, место № 20B) или авиабилета (даже при превышении лимита бронирования, например, ограничение составляет 210), я думаю, что веб-сайт не может заблокировать любую запись или начать транзакцию при отображении экрана покупки билета. 1003 *

Но после того, как пользователь нажмет «Подтвердить покупку», сервер должен начать транзакцию, номер места покупки 20B и попытаться выполнить фиксацию.

Если другой пользователь уже купил Seat 20B в предыдущей транзакции, то это часть «Подтверждение», что текущая транзакция завершится неудачей?

Итак ... нам не нужна блокировка уровня записи? Всегда ли транзакции проходят сериализацию (одну за другой), поэтому мы можем точно знать, что нет «условия гонки»? В какой ситуации необходима блокировка на уровне записи?

1 Ответ

0 голосов
/ 02 июля 2010

Перед вставкой строки Вы можете проверить, где существуют записи с одинаковым SeatId. Если существует, откатите его, в противном случае вставьте строку и зафиксируйте. Я даже не Cofident, и я думаю, что если служба довольно занята, вам, вероятно, потребуется блокировка перед началом операции вставки.

Однако Есть захватывающая вторая опция .

Вы поддерживаете showId и seatId сделать индекс с этими двумя. и создать уникальное ограничение на этот индекс. Теперь начните транзакцию с любой блокировки. если дублирование существует. это очевидно потерпит неудачу из-за уникального ограничения. и фиксация будет неудачной.

Неель

...