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

时间:2017-07-21 02:03:54

标签: sql sql-server transactions insert

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

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

我认为query1和query2都会失败。因为table将在第一个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

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

P.S。抱歉,我不擅长英语

1 个答案:

答案 0 :(得分:3)

Begin Tran之后的任何事情将被完全执行,否则一切都将失败。因此,你的价值条款也会失败..

来自官方文件(强调我的)

  

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

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

  

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

即使你不使用这两个条款之间的整个陈述,逻辑上也只能在一个交易中

此外,values子句只是语法糖,它作为单独的插入语句工作,你可以从下面的截图中看到相同的

enter image description here