Что произойдет, если вы не совершите транзакцию в базу данных (скажем, SQL Server)? - PullRequest
95 голосов
/ 04 февраля 2011

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

begin tran
-- some other sql code

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

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

Ответы [ 9 ]

127 голосов
/ 04 февраля 2011

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

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

33 голосов
/ 04 февраля 2011

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

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

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

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

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

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

Веселись!GJ.

13 голосов
/ 04 февраля 2011

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

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

3 голосов
/ 04 февраля 2011

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

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

2 голосов
/ 04 февраля 2011

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

1 голос
/ 06 марта 2014

Пример для транзакции

begin trans tt

Ваши операторы sql

если произошла ошибка отката, транзакция else commit ttt

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

0 голосов
/ 17 марта 2016

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

0 голосов
/ 14 ноября 2011

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

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 Основная информация [SqlAutoCommitExample: 65] [Найдено 0 # пользователей в базе данных]

0 голосов
/ 04 февраля 2011

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

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

...