Предположим, у меня есть запрос:
begin tran
-- some other sql code
И тогда я забываю совершить или откатиться.
Если другой клиент попытается выполнить запрос, что произойдет?
Предположим, у меня есть запрос:
begin tran
-- some other sql code
И тогда я забываю совершить или откатиться.
Если другой клиент попытается выполнить запрос, что произойдет?
До тех пор, пока вы не COMMIT или ROLLBACK сделки, она по- прежнему "работает" и, возможно, проведение замков.
Если ваш клиент (приложение или пользователь) закрывает соединение с базой данных перед фиксацией, все еще работающие транзакции будут откатываться и завершаться.
Вы можете попробовать это самостоятельно, что должно помочь вам понять, как это работает.
Откройте два окна (вкладки) в студии управления, у каждого из них будет собственное подключение к sql.
Теперь вы можете начать транзакцию в одном окне, сделать некоторые вещи, такие как insert/update/delete, но еще не зафиксировать. то в другом окне вы можете увидеть, как выглядит база данных вне транзакции. В зависимости от уровня изоляции таблица может быть заблокирована до тех пор, пока не будет зафиксировано первое окно, или вы можете (не видеть), что еще сделала транзакция и т.д.
Играйте с разными уровнями изоляции и без подсказки блокировки, чтобы увидеть, как они влияют на результаты.
Также посмотрите, что происходит, когда вы делаете ошибку в транзакции.
Очень важно понять, как работает все это, или вы будете в тупике от того, что делает sql, много раз.
Удачи! GJ.
Транзакции предназначены для полного или полного выполнения. Единственный способ совершить транзакцию - совершить, любой другой способ приведет к откату.
Поэтому, если вы начнете, а затем не зафиксируете, он будет откат при закрытии соединения (поскольку транзакция была оборвана без полной маркировки).
зависит от уровня изоляции входящей транзакции.
Когда вы открываете транзакцию, ничто не блокируется самостоятельно. Но если вы выполняете некоторые запросы внутри этой транзакции, в зависимости от уровня изоляции, некоторые строки, таблицы или страницы блокируются, поэтому они будут влиять на другие запросы, которые пытаются получить к ним доступ из других транзакций.
Пример транзакции
begin tran tt
Ваши операторы sql
если произошла ошибка rollback tran tt еще commit tran tt
Пока вы не выполнили commit tran tt, данные не будут изменены
В дополнение к потенциальным проблемам с блокировкой, которые могут возникнуть, вы также обнаружите, что ваши журналы транзакций начинают расти, поскольку они не могут быть усечены за минимальный 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 main INFO [SqlAutoCommitExample: 65] [Найдено 0 # пользователей в базе данных]