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

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

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

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

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

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

1 ответ

Решение

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

Однако есть захватывающий второй вариант.

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

Ниль

Другие вопросы по тегам