В явной транзакции, если я начну транзакцию, указав BEGIN TRANS, но если я не укажу COMMIT, ROLLBACK или END TRANS, что произойдет с приложением?
Каков результат при вызове BEGIN TRANS, но не при вызове COMMIT, ROLLBACK или END TRANS?
Ответы (4)
ничего - транзакция все еще продолжается. Если вы разрываете соединение, оно откатывается.
Поскольку ваша транзакция может заблокировать части базы данных, вы можете вызвать блокировку других транзакций/запросов, пока не выполните одну из этих команд.
В какой-то момент, так или иначе, транзакция должна быть завершена. Когда что-то пойдет не так (например, приложение завершилось), оно будет отменено, если только вы не зафиксируете его первым.
Если приложение завершает работу, соединение неявно закрывается и выполняется откат.
Если приложение работает на сервере приложений (например, ASPNET, сервере приложений Java и т. д.), то соединение, вероятно, возвращается в пул, где, как мы надеемся, оно сбрасывается перед повторным использованием, и транзакция в конечном итоге откатывается (но, возможно, не сразу). ).
Если неиспользуемое соединение находится в пуле, оно, вероятно, в конечном итоге будет закрыто сервером приложений, после чего транзакция определенно откатится.
Будьте осторожны с открытыми транзакциями слишком долго - вы заблокируете (если вы что-то изменили) и предотвратите очистку старых строк, что может иметь очень пагубные последствия для базы данных с большим количеством "оттока".
Вы получите нежелательное поведение, если оставите транзакцию открытой. Если он не откатывается, когда ваше приложение возвращает соединение с пулом, у вас будет блокирующая транзакция. Если его откатить, ваша работа будет потеряна. В любом случае, это не то поведение, которое вам хотелось бы в производственной среде.
/Хакан Винтер