Что произойдет, если вы не совершите транзакцию в базу данных (скажем, SQL Server)?
Предположим, у меня есть запрос:
begin tran
-- some other sql code
И тогда я забываю совершить или откатиться.
Если другой клиент попытается выполнить запрос, что произойдет?
Ответы
Ответ 1
До тех пор, пока вы не COMMIT или ROLLBACK сделки, она по- прежнему "работает" и, возможно, проведение замков.
Если ваш клиент (приложение или пользователь) закрывает соединение с базой данных перед фиксацией, все еще работающие транзакции будут откатываться и завершаться.
Ответ 2
Вы можете попробовать это самостоятельно, что должно помочь вам понять, как это работает.
Откройте два окна (вкладки) в студии управления, у каждого из них будет собственное подключение к sql.
Теперь вы можете начать транзакцию в одном окне, сделать некоторые вещи, такие как insert/update/delete, но еще не зафиксировать. то в другом окне вы можете увидеть, как выглядит база данных вне транзакции. В зависимости от уровня изоляции таблица может быть заблокирована до тех пор, пока не будет зафиксировано первое окно, или вы можете (не видеть), что еще сделала транзакция и т.д.
Играйте с разными уровнями изоляции и без подсказки блокировки, чтобы увидеть, как они влияют на результаты.
Также посмотрите, что происходит, когда вы делаете ошибку в транзакции.
Очень важно понять, как работает все это, или вы будете в тупике от того, что делает sql, много раз.
Удачи! GJ.
Ответ 3
Транзакции предназначены для полного или полного выполнения. Единственный способ совершить транзакцию - совершить, любой другой способ приведет к откату.
Поэтому, если вы начнете, а затем не зафиксируете, он будет откат при закрытии соединения (поскольку транзакция была оборвана без полной маркировки).
Ответ 4
зависит от уровня изоляции входящей транзакции.
Объяснение изоляции Sql
Ответ 5
Когда вы открываете транзакцию, ничто не блокируется самостоятельно. Но если вы выполняете некоторые запросы внутри этой транзакции, в зависимости от уровня изоляции, некоторые строки, таблицы или страницы блокируются, поэтому они будут влиять на другие запросы, которые пытаются получить к ним доступ из других транзакций.
Ответ 6
Пример транзакции
begin tran tt
Ваши операторы sql
если произошла ошибка rollback tran tt
еще commit tran tt
Пока вы не выполнили commit tran tt, данные не будут изменены
Ответ 7
В дополнение к потенциальным проблемам с блокировкой, которые могут возникнуть, вы также обнаружите, что ваши журналы транзакций начинают расти, поскольку они не могут быть усечены за минимальный LSN для активной транзакции, и если вы используете изоляцию моментальных снимков, то ваше хранилище версий в tempdb будет расти по тем же причинам.
Вы можете использовать dbcc opentran
для просмотра сведений о самой старой открытой транзакции.
Ответ 8
Любая незавершенная транзакция оставит сервер заблокированным, а другие запросы не будут выполняться на сервере. Вам нужно либо отменить транзакцию, либо передать ее. Закрытие SSMS также прекратит транзакцию, которая позволит выполнять другие запросы.
Ответ 9
Мой вопрос здесь, однако, почему иногда, даже когда вы делаете коммит, транзакция остается открытой? я вижу всплывающее окно, в котором все еще выполняется транзакция, но она находится в фоновом режиме позади всех других запросов, которые я выполнял, так как я зафиксировал транзакцию, которая все еще выполняется.
Ответ 10
Поведение не определено, поэтому вы должны явно указать фиксацию или откат:
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 # пользователей в базе данных]