当我执行此脚本时,即使第二个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]

最佳答案

您需要使用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

关于sql - 为什么不回滚此事务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53179311/

10-11 07:37