Що станеться, якщо ви не зробите транзакції з базою даних (скажімо, SQL Server)?


108

Припустимо, у мене є запит:

begin tran
-- some other sql code

І тоді я забуваю здійснити або відкотити.

Якщо інший клієнт намагається виконати запит, що буде?

Відповіді:


148

Поки ви не ЗРОБУЄМО чи ЗВ'ЯЗАТИ транзакцію, вона все ще "працює" і потенційно тримає блокування.

Якщо ваш клієнт (додаток або користувач) закриває з'єднання з базою даних перед вчиненням, будь-які ще запущені транзакції будуть відмовлені та припинені.


1
ммм, добре, я розумію, це створювало якесь замок. Я не був впевнений, що закриття зв'язку насправді виведе мене з цього стану. Проблема полягала в тому, що я отримував помилку, коли намагаюся зробити це. тепер я закрив зв’язок і все це спрацювало.
Чарбель

12
Побічна примітка: Якщо ви користуєтеся програмою Management Studio, закриття вікна запитів закриє з'єднання
Джо Філліпс

3
@BradleyDotNET: так, безумовно
marc_s

2
Майте на увазі, що SQL Server Management Studio автоматично бере на себе зобов’язання, якщо закрити вікно запиту / з'єднання за замовчуванням.
Нуно

1
Зауважте, що коли клієнт закриває з'єднання під час активної транзакції, він не завжди повертається назад - це залежить від клієнта та db. Наприклад, коли програма Java закриває з'єднання з db Oracle, будь-які відкриті з'єднання здійснюються автоматично.
AviD

38

Насправді ви можете спробувати це самостійно, що допоможе вам відчути, як це працює.

Відкрийте два вікна (вкладки) в студії управління, кожне з них матиме власне підключення до sql.

Тепер ви можете розпочати транзакцію в одному вікні, виконайте такі речі, як вставити / оновити / видалити, але ще не виконувати. тоді в іншому вікні ви бачите, як виглядає база даних поза трансакцією. Залежно від рівня ізоляції таблиця може бути заблокована, поки не буде виконано перше вікно, або ви (не) зможете побачити, що робила інша транзакція до цього часу тощо.

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

Також дивіться, що відбувається, коли ви кидаєте помилку в транзакції.

Дуже важливо зрозуміти, як працює весь цей матеріал, або ви будете спотикатися тим, що робить sql, багато разів.

Веселіться! GJ.


ОК, але чи буде транзакція записана в журнал щонайменше перед тим, як видавати комісію? Наприклад, скажіть, що я хочу розпочати транзакцію, виконайте команду insert і "зробіть щось інше", перш ніж виконувати фіксацію. чи буде написана моя команда вставки для реєстрації? таким чином, якщо сервер виходить з ладу перед виконанням комітету .. він може повернутися туди, де він був, і я можу просто надати фіксацію пізніше (коли б я не робив щось інше).
користувач1870400

16

Операції призначені для здійснення повністю або взагалі. Єдиний спосіб завершити транзакцію - здійснити будь-який інший спосіб призведе до відкоту.

Тому, якщо ви почнете, а потім не скористаєтеся, він буде відкатаний після закриття з'єднання (оскільки транзакція була розірвана без позначення як завершеної).


Так і має бути, але це не завжди так.
FalcoGer

... наприклад, MyISAM MySQL, який не підтримує транзакції, звичайно.
Пісквор вийшов з будівлі

3

залежить від рівня ізоляції вхідної транзакції.

Роз'яснення ізоляції транзакцій Sql


6
Поведінка транзакцій не залежить від рівня ізоляції. Кількість замків, які вони можуть викликати, робить.
marc_s

Я майже впевнений, які дані можуть бути прочитані з'єднанням, безумовно, залежить від рівня ізоляції. Якщо вам встановлено ізоляцію ЧИТАТИ НЕЗАКОМНОГО, ви можете прочитати дані, які ще не здійснені, і насправді вони можуть бути повернуті в якийсь момент доріжки, але це забезпечує відсутність блокування. Якщо ви прочитали ЗВ'ЯЗАНО ЗВ'ЯЗАНО в якості рівня ізоляції, ви не можете прочитати непослані рядки - другий клієнт буде висіти, якщо ви не використовуєте SNAPSHOT.
Xhalent

2

Коли ви відкриваєте транзакцію, нічого не блокується само собою. Але якщо виконувати деякі запити всередині цієї транзакції, залежно від рівня ізоляції, деякі рядки, таблиці або сторінки заблокуються, тому це вплине на інші запити, які намагаються отримати доступ до них з інших транзакцій.


1

Приклад транзакції

почати тран тт

Ваші заяви sql

якщо сталася помилка відкат tran tt else вчиняти tran tt

Поки ви не виконали трансакцію, дані не будуть змінені


1
Зауважте, що імена транзакцій не тільки непотрібні в MS SQL, це може дати помилкове відчуття контролю. BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Yне працює, наприклад. Див stackoverflow.com/questions/1273376 / ...

0

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

Ви можете використовувати dbcc opentranдля перегляду деталей найдавнішої відкритої транзакції.


0

Будь-яка невдала транзакція залишить сервер заблокованим, а інші запити не виконуватимуться на сервері. Вам або потрібно відкатати транзакцію, або здійснити її. Закриття SSMS також припинить транзакцію, що дозволить виконувати інші запити.


-4

Поведінка не визначена, тому потрібно чітко встановити фіксацію чи відкат:

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 основна ІНФО


2
Це може бути правдою для Oracle (я поняття не маю), але запитуючий запитує про MS-SQL
PaulG

Перша цитата стосується драйвера JDBC, а не сервера.
djechlin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.