为什么此交易不回滚?

时间:2018-11-06 20:13:11

标签: sql sql-server tsql transactions

当我执行此脚本时,尽管第二INSERT由于对Fluffiness的NOT NULL约束而失败,但第一个INSERT仍然有效。为什么第一行仍然存在,为什么不回滚?

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 :(得分: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

db<>fiddle demo

相关文章:Error Handling in SQL by Erland Sommarskog

  

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

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

到目前为止,我所说的内容适用于XACT_ABORT为OFF(默认设置)的情况。 当您将SET XACT_ABORT ON发出时,大多数语句终止错误会变成批中止错误