为什么这个事务没有回滚?

nic*_*omp 2 sql t-sql sql-server transactions

当我执行这个脚本时,第一个脚本INSERT工作,即使第二个脚本INSERT由于Fluffiness上的NOT NULL约束而失败.为什么第一行仍然存在,为什么不回滚?

BEGIN TRAN
    INSERT INTO tCat(Cat, Fluffiness) VALUES('Sir Pounce A Lot', 8.0)
    INSERT INTO tCat(Cat)             VALUES('Violet')
COMMIT 
Run Code Online (Sandbox Code Playgroud)

这是表脚本

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]
Run Code Online (Sandbox Code Playgroud)

Luk*_*zda 6

你需要使用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
Run Code Online (Sandbox Code Playgroud)

db <>小提琴演示

相关文章:Erland Sommarskog在SQL中的错误处理

此表列出了一些常见错误,以及它们是中止当前语句还是整个批处理.

+---------------------+-----------+
|        Error        |  Aborts   |
+---------------------+-----------+
| NOT NULL violation. | Statement |
+---------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

我所说的这远远适用于XACT_ABORT为OFF时,这是默认值.当您发出SET XACT_ABORT ON时,大多数语句终止错误将成为批量中止错误