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


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

begin tran
-- some other sql code

а потом я забываю совершить или откатить.

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

9 82

9 ответов:

до тех пор, пока вы не COMMIT или откат транзакция, она все еще" работает " и потенциально удерживает блокировки.

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

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

откройте два окна (вкладки) в среде management studio, каждое из которых будет иметь свое собственное подключение к sql.

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

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

и посмотреть, что происходит, когда вы бросаете ошибку в сделке.

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

удачи! ГДж.

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

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

зависит от уровня изоляции транзакции входящию.

изоляция транзакций Sql объяснена

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

пример сделки

начать Тран ТТ

SQL-операторах

Если произошла ошибка откат Тран ТТ еще совершить Тран ТТ

пока вы не выполнили commit tran tt, данные не будут изменены

в дополнение к потенциальным проблемам блокировки, которые вы можете вызвать, вы также обнаружите, что ваши журналы транзакций начинают расти, поскольку они не могут быть усечены после минимального LSN для активной транзакции, и если вы используете изоляцию моментальных снимков, ваше хранилище версий в tempdb будет расти по аналогичным причинам.

можно использовать dbcc opentran для просмотра сведений о самой старой открытой транзакции.

любая несогласованная транзакция оставит сервер заблокированным, а другие запросы не будут выполняться на сервере. Вам нужно либо откатить транзакцию, либо зафиксировать ее. Закрытие SSMS также завершит транзакцию, которая позволит выполнять другие запросы.

поведение не определено, поэтому вы должны явно установить фиксацию или откат:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

" если режим автоматической фиксации отключен и вы закрываете соединение без явной фиксации или отката последних изменений, то выполняется неявная операция фиксации."

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