Если я закрою запрос между транзакцией «Начало транзакции» и совершить транзакцию в MS SQL, что произойдет, если я прекратил или прекратил выполнение запроса. Будут ли все изменения, которые были сделаны во время выполнения ROLLBACKED.?начать транзакцию и совершить транзакцию в MS SQL
ответ
Это зависит от вашего кода. Пока ваша транзакция существует, все изменения будут ожидаться откат или фиксация.
Возможно, вы захотите посмотреть this.
Нет. Транзакция будет по-прежнему активна - вы все-таки откатывались, не так ли? :) Запустите этот пример и посмотрите, что произойдет. Если вы разорвете во время транзакции, вы увидите, что значение 2 находится в таблице, но вам нужно откат или фиксация.
select 1 as x into #xxx
GO
begin transaction
insert into #xxx(x) select 2
-- ctrl+break before time runs out.
waitfor delay '00:00:10'
commit transaction
-- now try this:
select * from #xxx
rollback transaction
select * from #xxx
Ваша транзакция может оставаться открытым до тех пор, пока назвать что-то вроде ROLLBACK TRANSACTION
или COMMIT TRANSACTION
, или до тех пор, пока SQL принимает какое-то действие на него.
Подробнее:
- SQL Server and connection loss in the middle of a transaction
- What happens to an uncommitted transaction when the connection is closed?
- What happens if you don't commit transaction in a database (say SQL Server)
Я на самом деле хотел бы воспользоваться этим при тестировании больших обновлений или исправлений. Вы можете иметь что-то вроде этого:
-- BEGIN TRANSACTION
-- ROLLBACK TRANSACTION
-- COMMIT TRANSACTION
/*
A bunch of SQL code here
*/
Затем вы можете выделить/запустить BEGIN TRANSACTION
, а затем запустить весь сценарий. Если вы довольны результатами, вы можете выделить/запустить COMMIT TRANSACTION
. Если нет, запустите ROLLBACK TRANSACTION
. Поскольку эти строки закомментированы, они не влияют на общую транзакцию, если вы явно не выделяете и не запускаете их.