В 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 не работает все время.Это действительно зависит от типа ошибки, как я думаю?