Предположим, у меня есть запрос:
begin tran
-- some other sql code
А потом я забываю зафиксировать или откатиться.
Что произойдет, если другой клиент попытается выполнить запрос?
sql-server
transactions
commit
Charbel
источник
источник
Вы можете попробовать это сами, это должно помочь вам понять, как это работает.
Откройте два окна (вкладки) в студии управления, каждое из которых будет иметь собственное подключение к sql.
Теперь вы можете начать транзакцию в одном окне, сделать что-то вроде вставки / обновления / удаления, но еще не зафиксировать. затем в другом окне вы можете увидеть, как база данных выглядит вне транзакции. В зависимости от уровня изоляции таблица может быть заблокирована до тех пор, пока не будет зафиксировано первое окно, или вы можете (не) увидеть, что уже сделала другая транзакция и т. Д.
Поиграйте с различными уровнями изоляции и отсутствием подсказок о блокировке, чтобы увидеть, как они влияют на результаты.
Также посмотрите, что происходит, когда вы выдаете ошибку в транзакции.
Очень важно понимать, как все это работает, иначе вы будете много раз озадачены тем, что делает sql.
Радоваться, веселиться! GJ.
источник
Транзакции предназначены для выполнения полностью или вообще не выполняются. Единственный способ завершить транзакцию - это зафиксировать, любой другой способ приведет к откату.
Следовательно, если вы начнете, а затем не зафиксируете, произойдет откат при закрытии соединения (поскольку транзакция была прервана без пометки как завершенной).
источник
зависит от уровня изоляции входящей транзакции.
Объяснение изоляции транзакций sql
источник
Когда вы открываете транзакцию, ничего не блокируется само по себе. Но если вы выполняете некоторые запросы внутри этой транзакции, в зависимости от уровня изоляции, некоторые строки, таблицы или страницы блокируются, поэтому это повлияет на другие запросы, которые пытаются получить к ним доступ из других транзакций.
источник
Пример транзакции
начать транссексуал
Ваши операторы 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
Hsqldb делает откат
результат
источник