Каков результат при вызове BEGIN TRANS, но не COMMIT, ROLLBACK или END TRANS? - PullRequest
2 голосов
/ 25 июня 2009

В явной транзакции, если я начинаю транзакцию, давая BEGIN TRANS, но если я не даю COMMIT, ROLLBACK или END TRANS, что будет с приложением?

Ответы [ 4 ]

8 голосов
/ 25 июня 2009

ничего - транзакция все еще продолжается. Если вы прервете соединение, оно будет отменено.

6 голосов
/ 25 июня 2009

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

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

1 голос
/ 25 июня 2009

Если приложение закрывается, то соединение неявно закрывается и откатывается.

Если приложение выполняется на сервере приложений (например, ASPNET, сервер приложений Java и т. Д.), Соединение, вероятно, будет возвращено в пул, где, как мы надеемся, оно будет сброшено до повторного использования, и транзакция в конечном итоге будет откатана (но возможно не сразу).

Если неиспользуемое соединение находится в пуле, оно, вероятно, в конечном итоге закрывается сервером приложений, и в этот момент транзакция определенно откатывается.

Остерегайтесь слишком долго держать открытые транзакции - вы будете удерживать блокировки (если вы что-то изменили) и не будете очищать старые строки, что может оказать очень пагубное влияние на базу данных с большим "оттоком" ».

0 голосов
/ 25 июня 2009

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

/ Хокан Винтер

...