Скажіть, я веду запит
begin tran
update users
set name = 'Jimmy'
where name = 'john'
Якщо я НЕ відмовляю транзакцію, чи все-таки ці зміни будуть внесені, чи це призведе до помилки, чи все-таки вона діятиме як відкат?
Скажіть, я веду запит
begin tran
update users
set name = 'Jimmy'
where name = 'john'
Якщо я НЕ відмовляю транзакцію, чи все-таки ці зміни будуть внесені, чи це призведе до помилки, чи все-таки вона діятиме як відкат?
Відповіді:
Ви повинні розуміти, що таке транзакція - Це єдина одиниця роботи. Це ВСЕ або НІЩО (відповідає властивостям кислоти ), і це гарантує узгодженість бази даних.
Якщо я НЕ відмовляю транзакцію, чи все-таки ці зміни будуть внесені
Зміни будуть внесені, лише якщо ви покладете на них зобов'язання. SQL-сервер записуватиме всі зміни в журнал транзакцій, і як тільки ви здійснюєте, вони зміцнюються у файл даних.
Якщо ви не приймаєте на себе зобов’язання, ваша транзакція залишатиметься ВІДКРИТИЙ на невизначений термін - що ви можете бачити sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactionsабо використовувати DBCC OPENTRAN.
Крім того, те, що ви ініціювали, - це явна транзакція , яка повинна бути явно закінчена оператором COMMIT або ROLLBACK.
Читайте також - Чи погана практика завжди створювати транзакцію?
Якщо ви не скористаєтесь і не відкажете транзакцію, транзакція буде продовжувати існувати нескінченно. Він продовжуватиме утримувати свої блокування, потенційно блокуючи інші сеанси, доки ви не закінчите транзакцію через a commitабо a rollbackабо, поки DBA не прийде і не вб'є сеанс (або поки щось на зразок мережної ікони не призведе до збою з'єднання). Якщо DBA вбиває сеанс, вони неявно видають відкат для цієї та будь-яких інших відкритих транзакцій.