SQL Server: BEGIN TRAN ... COMMIT без ROLLBACK не выполняет откат в зависимости от ошибки - PullRequest
0 голосов
/ 21 мая 2018

В Microsoft SQL Server я создаю тестовую таблицу с

CREATE TABLE [Test]
(
    [BookID] [int] NOT NULL,
    [Name] [varchar](512) NOT NULL,

    CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([BookID] ASC)
) ON [PRIMARY]

Затем, когда я запускаю:

BEGIN TRAN;

INSERT INTO Test (BookID, Name) Values (1,'one');
INSERT INTO Test (BookID, Name) Values (2,'Two');
INSERT INTO Test (BookID, Name) Values (1,'Three');
INSERT INTO Test (BookID, Name) Values (4,'Four');

COMMIT TRAN;

Я ожидаю, что ничего не будет в Test как insert (1, 'Three')генерирует ошибку

Нарушение ограничения PRIMARY KEY 'PK_Test'

Но на самом деле в таблице есть строки с BookId = 1, 2, 4.

Если I SET XACT_ABORT ON, затем я получаю ожидаемое поведение.

Затем для другого фрагмента кода, когда ошибка похожа на

Журнал транзакций для базы данных 'MyDatabase' заполнен из-за 'ACTIVE_TRANSACTION'

Откат транзакции работает

Чтобы убедиться в получении отката, я должен включить оператор в оператор TRY ... COMMIT CATCH ROLLBACK.

Но яЯ все еще задаюсь вопросом, почему BEGIN TRAN без ROLLBACK не работает все время.Это действительно зависит от типа ошибки, как я думаю?

1 Ответ

0 голосов
/ 21 мая 2018

Но мне все еще интересно, почему BEGIN TRAN без ROLLBACK не работает все время.Действительно ли это зависит от типа ошибки, как мне кажется?

Вы правы, это зависит от типа ошибки. Нижеприведенное высказывание Эрланда помогло мне лучше понять различные варианты обработки ошибок в SQL Server..

Обработка ошибок в SQL Server - очень запутанная история.Я задал тот же вопрос, что и вы в comp.databases.sybase в 1993 году или около того.Я не помню точно, какие ответы я получил, но я не думаю, что они были очень хорошими.

Но это история: когда происходит ошибка в SQL Server, пакет может быть прерван, и транзакцияоткат.Или оператор может быть прекращен, и транзакция продолжается.

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

В защиту Microsoft можно сказать, что многие из этих плохих решений были приняты в Калифорнии, когда продукт все еще был Sybase.С другой стороны, Microsoft прилагает очень много усилий, чтобы исправить это, а не наоборот.

См. Скриншот ниже для различных сценариев

enter image description here

Эта ссылка содержит отличную информацию о каждом поведении

Обработка ошибок и транзакций в SQL Server

Эта ошибка

Журнал транзакций для базы данных MyDatabase заполнен, поскольку ACTIVE_TRANSACTION

может происходить по многим причинам.Некоторые из них включают

  1. У вас есть активная транзакция, которая представляет повторное использование пространства журнала
  2. Тяжелая транзакция, которая может потребовать много места в журнале, и ваш диск может быть заполнен

Дополнительная справка:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6ae24a04-0ad3-4aba-b471-2bbbcd8d8626/with-the-transaction-primary-key-violation-error?forum=transactsql

...