2012-05-07 22 views
2

Я делаю это в SQL Server 2005. У меня есть таблица, есть только один столбец типа int, o вы не можете вставлять в него символ.Мы можем откатиться, не сказав «Откат»?

Если я запустил это, у меня будет один ряд, вставленный в мой стол.

INSERT INTO TestTable VALUES(3) --success 
INSERT INTO TestTable VALUES('b') --fail, cannot insert char 

Если я запустил это, у меня будет строка ZERO, вставленная в мой стол. Таким образом, транзакция 2-й группы выполняет одно исполнительное устройство. Если одна задача завершилась неудачно, вся транзакция завершится с ошибкой.

BEGIN TRANSACTION 
INSERT INTO TestTable VALUES(3) 
INSERT INTO TestTable VALUES('b') 
COMMIT TRANSACTION 

Мой вопрос: Это кажется, что ROLLBACK TRANSACTION бесполезно, потому что у меня нет ROLLBACK в приведенном выше коде, но она все еще откат .... Может кто-нибудь помочь мне понять это?

+4

Если * ни один из ваших утверждений не работает, но вы тем не менее хотите отменить изменения, «ROLLBACK» очень полезен. :) –

+0

что ВСЕ ваш код? (или, по крайней мере, весь * соответствующий * код) – MilkyWayJoe

+0

@ MilkyWayJoe: да, это все мой код. Просто для обучения. –

ответ

0

В SQL Server весь код выполняется по неявной транзакции по умолчанию. Если вы отправляете оба оператора в одной партии, и у вас есть опция запроса XACT_ABORT, любой отказ должен отменить всю транзакцию. По умолчанию используется только откат инструкции, вызвавшей ошибку. Если вы отправляете заявления в свои собственные партии (либо выделяя их отдельно в SSMS, либо нажимаете F5 или делаете «go»), я думаю, вы увидите другое поведение.

Смежные вопросы