Почему не происходит откат этой транзакции? - PullRequest
0 голосов
/ 06 ноября 2018

Когда я выполняю этот скрипт, первый INSERT работает, даже если второй INSERT дает сбой из-за ограничения NOT NULL для Fluffiness. Почему сохраняется первая строка и почему она не откатывается?

BEGIN TRAN
    INSERT INTO tCat(Cat, Fluffiness) VALUES('Sir Pounce A Lot', 8.0)
    INSERT INTO tCat(Cat)             VALUES('Violet')
COMMIT 

Вот табличный скрипт

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tCat]
(
    [CatID] [INT] IDENTITY(1,1) NOT NULL,
    [Cat] [NCHAR](100) NOT NULL,
    [CatBreedID] [INT] NULL,
    [Fluffiness] [FLOAT] NOT NULL,

    CONSTRAINT [PK_tCat] 
        PRIMARY KEY CLUSTERED  ([CatID] ASC)
) ON [PRIMARY]

1 Ответ

0 голосов
/ 06 ноября 2018

Вам нужно использовать SET XACT_ABORT ON:

SET XACT_ABORT ON;
BEGIN TRAN
    INSERT INTO tCat(Cat, Fluffiness) VALUES('Sir Pounce A Lot', 8.0)
    INSERT INTO tCat(Cat)             VALUES('Violet')
COMMIT

ДБ <> Fiddle demo

Статья по теме: Обработка ошибок в SQL от Erland Sommarskog

В этой таблице перечислены некоторые распространенные ошибки и указаны ли прерывания текущего оператора или всего пакета.

+---------------------+-----------+
|        Error        |  Aborts   |
+---------------------+-----------+
| NOT NULL violation. | Statement |
+---------------------+-----------+

То, что я сказал, относится к случаю, когда XACT_ABORT выключен, что по умолчанию. Когда вы запускаете SET XACT_ABORT ON, большинство ошибок завершения операторов вместо этого становятся ошибками прерывания пакета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...