Ответы:
Пока вы не выполняете COMMIT или ROLLBACK транзакцию, она все еще "выполняется" и, возможно, удерживает блокировки.
Если ваш клиент (приложение или пользователь) закрывает соединение с базой данных перед фиксацией, все еще выполняющиеся транзакции будут отменены и прекращены.
Вы можете попробовать это сами, это должно помочь вам понять, как это работает.
Откройте два окна (вкладки) в студии управления, каждое из которых будет иметь собственное подключение к sql.
Теперь вы можете начать транзакцию в одном окне, сделать что-то вроде вставки / обновления / удаления, но еще не зафиксировать. затем в другом окне вы можете увидеть, как база данных выглядит вне транзакции. В зависимости от уровня изоляции таблица может быть заблокирована до тех пор, пока не будет зафиксировано первое окно, или вы можете (не) увидеть, что уже сделала другая транзакция и т. Д.
Поиграйте с различными уровнями изоляции и отсутствием подсказок о блокировке, чтобы увидеть, как они влияют на результаты.
Также посмотрите, что происходит, когда вы выдаете ошибку в транзакции.
Очень важно понимать, как все это работает, иначе вы будете много раз озадачены тем, что делает sql.
Радоваться, веселиться! GJ.
Транзакции предназначены для выполнения полностью или вообще не выполняются. Единственный способ завершить транзакцию - это зафиксировать, любой другой способ приведет к откату.
Следовательно, если вы начнете, а затем не зафиксируете, произойдет откат при закрытии соединения (поскольку транзакция была прервана без пометки как завершенной).
зависит от уровня изоляции входящей транзакции.
Когда вы открываете транзакцию, ничего не блокируется само по себе. Но если вы выполняете некоторые запросы внутри этой транзакции, в зависимости от уровня изоляции, некоторые строки, таблицы или страницы блокируются, поэтому это повлияет на другие запросы, которые пытаются получить к ним доступ из других транзакций.
Пример транзакции
начать транссексуал
Ваши операторы sql
если произошла ошибка откатить tran tt иначе зафиксировать tran tt
Пока вы не выполнили фиксацию транзакции, данные не будут изменены.
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
не работает, например. См stackoverflow.com/questions/1273376/...
В дополнение к потенциальным проблемам с блокировкой, которые вы можете вызвать, вы также обнаружите, что ваши журналы транзакций начинают расти, поскольку они не могут быть усечены после минимального LSN для активной транзакции, и если вы используете изоляцию моментальных снимков, ваше хранилище версий в tempdb будет расти за аналогичные причины.
Вы можете использовать dbcc opentran
для просмотра сведений о самой старой открытой транзакции.
Любая незавершенная транзакция оставит сервер заблокированным, и другие запросы не будут выполняться на сервере. Вам нужно либо откатить транзакцию, либо зафиксировать ее. Закрытие SSMS также приведет к прекращению транзакции, что позволит выполнять другие запросы.
Поведение не определено, поэтому вы должны явно установить фиксацию или откат:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
«Если режим автоматической фиксации отключен, и вы закрываете соединение без явной фиксации или отката ваших последних изменений, то выполняется неявная операция COMMIT».
Hsqldb делает откат
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
результат
2011-11-14 14: 20: 22,519 основная ИНФОРМАЦИЯ [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22,546 основная ИНФОРМАЦИЯ [SqlAutoCommitExample: 65] [Найдено 0 # пользователей в базе данных]