Afzaal Ahmad Zeeshan
Вот вы идете, переходите по этим ссылкам и изучаете, как они работают—о чем, как вы упомянули, вы уже знаете.
база данных - правильное использование транзакций в SQL Server 2008 - переполнение стека[^]
НАЧАТЬ ТРАНЗАКЦИЮ (Transact-SQL) - SQL Server | Microsoft Docs[^]
Теперь, как вы можете видеть, что а TRANSACTION
запрос предоставляет другие предложения и команды SQL, которые можно использовать для управления обработкой транзакции. COMMIT
и ROLLBACK
позволяет вам контролировать поведение, а также побочные эффекты запросов, которые выполняются а те, что были выполнены Позвольте мне дать вам 2 сценария, которые могут объяснить эти транзакции.
Прежде всего, предположим, что у вас есть система, в которой в любой момент времени подключено по крайней мере более 5 пользователей и работает—5 просто произвольно, это могут быть всего 2 пользователя, которые могут испортить согласованность данных в системе Теперь вы пытаетесь выполнить запрос, скажем, бронирование мест—очень старая школьная проблема в информатике,—но поскольку несколько пользователей пытаются забронировать билеты, может быть шанс, что пользователю 3 было предоставлено 7 мест, и он попытался зарезервировать 4 (осталось 3?), но прежде чем пользователь 3 смог закончить заказ, пользователь 5 забронировал 4 билета (наугад!), а пользователь 3 также(!) подал запрос на 4 билета... Кто и сколько получает билетов? И сколько билетов осталось для других пользователей... Эти проблемы аналогичны условиям гонки в многопоточных средах Вы можете попробовать это с помощью транзакции и убедиться, что только пользователь, который пытался забронировать места первым, получает их, а другие пользователи ждут команды. Да, они ждут. Они не держат стоимость билетов, которые они ищут.
Во-вторых, в свете того, что я только что сказал выше, как должна действовать система баз данных, если она обнаружит, что отклик на значение теперь меньше, чем ожидалось? Например, пользователь хочет 4 места, но в результате получается только 3 места—и предположительно мы уже внесли изменения в одну из таблиц, когда мы проходили транзакцию—система должна сделать что? Транзакция позволит вам контролировать поток. Если все пойдет хорошо,
- Вы запросите таблицу билетов и обнаружите, что билеты доступны.
- Вы обновляете статус билетов в таблице билетов для продажи.
- Вы запросите учетную запись пользователя и обнаружите, что у них недостаточно кредитов.
Обратите внимание, что вышеуказанные случаи могут быть в любом случае (сначала проверка кредита, а затем проверка билета, возможно), и в этих случаях вы используете
ROLLBACK
чтобы отменить все изменения, или вы
COMMIT
изменения, чтобы сохранить их в системе.
Вы не можете сделать это и поддерживать это свойство ACID вашей базы данных без использования некоторых внешних служб или языков, таких как поддержка C# или Java. Вы можете сказать, что вы можете только запросить всю информацию и после того, как все ограничения будут выполнены, вы можете обработать ее, но это не гарантирует необходимую блокировку, и в случае, если кто-то другой запросил купить билеты, пока вы держите предыдущую информацию, это то, что мы пытаемся игнорировать здесь.
Такие же концепции поддерживаются и другими реляционными базами данных, такими как Oracle, MySQL и т. д. Вы должны проверить их документацию, чтобы увидеть, какая из них применима к вашей системе баз данных.