事务如何在 SQL Server 中具有多个 VALUES 的单个 INSERT 中工作

dda*_*ngi 2 sql sql-server transactions insert

我想确保一次插入 2 行。如果我INSERT像这样同时执行 2 个查询

CREATE TABLE [dbo].[Table_test2]
(
    [column1] [int] NOT NULL ,
    [column2] [int] NOT NULL ,
    PRIMARY KEY(column1, column2)
)
-- column1 & column2 = primary key

--query 1
BEGIN TRAN
    INSERT INTO Table_test(column1, column2) VALUES (1,1)
    INSERT INTO Table_test(column1, column2) VALUES (2,2)

    COMMIT TRAN

--query 2
BEGIN TRAN
    INSERT INTO Table_test(column1, column2) VALUES (2,2)
    INSERT INTO Table_test(column1, column2) VALUES (1,1)

    COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

我认为 query1 和 query2 都会失败。因为表将在第一条INSERT语句后解锁,所以 query1 和 query2 将成功插入第一行。但是当每个查询插入第二条INSERT语句时,它无法正常工作。

所以我会像这样改变查询。可以吗?

如果第一个查询正常工作,则可以忽略第二个查询。

--query 1
BEGIN TRAN
    INSERT INTO Table_test(column1, column2) VALUES (1,1), (2,2)
    COMMIT TRAN

--query 2
BEGIN TRAN
    INSERT INTO Table_test(column1, column2) VALUES (2,2), (1,1)
    COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

我想知道我是否使用INSERT具有多个值的单个语句,是否确保在一个事务中插入 2 行?

ps 抱歉我英语不好

The*_*war 5

之后的任何内容Begin Tran 都将完全执行或全部失败..所以您的值子句也将失败..

来自官方文档(重点是我的)

BEGIN TRANSACTION 表示连接引用的数据在逻辑上和物理上一致的点。如果遇到错误,在 BEGIN TRANSACTION 之后所做的所有数据修改都可以回滚以将数据返回到这种已知的一致性状态

所以没关系,如果你重视条款或单独的 DML,一切都会失败..

我想知道我是否使用具有多个值的单个 INSERT 语句,是否确保在一个事务中插入 2 行?

即使您不在这两个子句之间使用整个语句,逻辑上也将在一个事务下

此外 values 子句只是语法糖,它在引擎盖下作为单独的插入语句工作,您可以从下面的屏幕截图中看到相同的内容

在此处输入图片说明