Что произойдет, если вы не совершите транзакцию в базу данных (скажем, SQL Server)?

Предположим, у меня есть запрос:

begin tran
-- some other sql code

И тогда я забываю совершить или откатиться.

Если другой клиент попытается выполнить запрос, что произойдет?

Ответ 1

До тех пор, пока вы не COMMIT или ROLLBACK сделки, она по- прежнему "работает" и, возможно, проведение замков.

Если ваш клиент (приложение или пользователь) закрывает соединение с базой данных перед фиксацией, все еще работающие транзакции будут откатываться и завершаться.

Ответ 2

Вы можете попробовать это самостоятельно, что должно помочь вам понять, как это работает.

Откройте два окна (вкладки) в студии управления, у каждого из них будет собственное подключение к sql.

Теперь вы можете начать транзакцию в одном окне, сделать некоторые вещи, такие как insert/update/delete, но еще не зафиксировать. то в другом окне вы можете увидеть, как выглядит база данных вне транзакции. В зависимости от уровня изоляции таблица может быть заблокирована до тех пор, пока не будет зафиксировано первое окно, или вы можете (не видеть), что еще сделала транзакция и т.д.

Играйте с разными уровнями изоляции и без подсказки блокировки, чтобы увидеть, как они влияют на результаты.

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

Очень важно понять, как работает все это, или вы будете в тупике от того, что делает sql, много раз.

Удачи! GJ.

Ответ 3

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

Поэтому, если вы начнете, а затем не зафиксируете, он будет откат при закрытии соединения (поскольку транзакция была оборвана без полной маркировки).

Ответ 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 # пользователей в базе данных]