Если вы не откатите транзакцию, будут ли внесены изменения?

10

Скажите, что я выполняю запрос

begin tran

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

Если я НЕ ОТМЕНЯЮ транзакцию, будут ли эти изменения все-таки внесены, выдаст ли ошибку или все равно будет выполнять откат?

Джош Стивенсон
источник
Я предполагаю, что это зависит от поведения клиентского программного обеспечения, которое вы используете для запуска этих операторов, или приложения, в которое они встроены. Некоторые из них могут автоматически фиксироваться, если настроены (SSMS сделает это по умолчанию).
Мустаччо
3
Явно объявленные транзакции не фиксируются автоматически. Поскольку Джош объявил о начале транзакции, он будет вести себя точно так, как ответил Джастин Кейв.
Дейв

Ответы:

16

Вы должны понимать, что такое транзакция - это единая единица работы. Это ВСЕ или НИЧЕГО (следует свойствам ACID ), и это гарантирует согласованность базы данных.

Если я не выполню откат транзакции, будут ли внесены эти изменения?

Изменения будут сделаны, только если вы совершите коммит. SQL-сервер запишет все изменения в журнал транзакций, и после фиксации они будут зафиксированы в файле данных.

Если вы не сделаете коммит, то ваша транзакция останется ОТКРЫТА на неопределенный срок - что вы можете увидеть sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactionsили использовать DBCC OPENTRAN.

Кроме того, вы инициировали явную транзакцию , которая должна быть явно завершена оператором COMMIT или ROLLBACK.

Также прочитайте - это плохая практика всегда создавать транзакцию?

Кин Шах
источник
@JoshStevenson Я думаю, что стоит прочитать об атомных операциях в контексте базы данных.
Нельц
12

Если вы не подтвердите и не откатите транзакцию, транзакция будет существовать бесконечно. Он будет продолжать удерживать свои блокировки, потенциально блокируя другие сеансы, до тех пор, пока вы не завершите транзакцию с помощью commitили, rollbackили пока DBA не придет и не завершит сеанс (или пока что-то вроде сетевого сбоя не вызовет сбой соединения). Если администратор базы данных убивает сеанс, он неявно выполнит откат для этой и любых других открытых транзакций.

Джастин Кейв
источник
Это правильный ответ. Без этой информации у меня не было смысла использовать операторы COMMIT и ROLLBACK в целом.
Тарек
1

Изменения не будут внесены до тех пор, пока транзакция не будет совершена, все или ничего, как указано выше, не ответит

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

Митеш Бишт
источник