Якщо ви не відкажете транзакцію, чи все ж зміни будуть внесені?


10

Скажіть, я веду запит

begin tran

update users
set name = 'Jimmy'
where name = 'john'

Якщо я НЕ відмовляю транзакцію, чи все-таки ці зміни будуть внесені, чи це призведе до помилки, чи все-таки вона діятиме як відкат?


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

3
Явно задекларовані транзакції не здійснюються автоматично. Оскільки Джош оголосив про початок угоди, він буде вести себе так, як відповів Джастін Кейв.
Дейв

Відповіді:


16

Ви повинні розуміти, що таке транзакція - Це єдина одиниця роботи. Це ВСЕ або НІЩО (відповідає властивостям кислоти ), і це гарантує узгодженість бази даних.

Якщо я НЕ відмовляю транзакцію, чи все-таки ці зміни будуть внесені

Зміни будуть внесені, лише якщо ви покладете на них зобов'язання. SQL-сервер записуватиме всі зміни в журнал транзакцій, і як тільки ви здійснюєте, вони зміцнюються у файл даних.

Якщо ви не приймаєте на себе зобов’язання, ваша транзакція залишатиметься ВІДКРИТИЙ на невизначений термін - що ви можете бачити sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactionsабо використовувати DBCC OPENTRAN.

Крім того, те, що ви ініціювали, - це явна транзакція , яка повинна бути явно закінчена оператором COMMIT або ROLLBACK.

Читайте також - Чи погана практика завжди створювати транзакцію?


@JoshStevenson Я вважаю, що варто прочитати про Атомні операції в контексті бази даних.
Нельц

12

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


Це правильна відповідь. Без цієї інформації для мене не було сенсу використовувати як твердження COMMIT, так і ROLLBACK взагалі.
Тарек

1

Зміни не вноситимуться до тих пір, поки транзакція не буде здійснена, все або нічого, як зазначено вище, не відповідає,

Причиною цього є атомність. Ви можете перевірити властивості транзакцій ACID, його основні властивості, за якими слідує система бази даних.

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