我想确保一次插入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。抱歉,我不擅长英语
答案 0 :(得分:3)
Begin Tran
之后的任何事情将被完全执行,否则一切都将失败。因此,你的价值条款也会失败..
来自官方文件(强调我的)
BEGIN TRANSACTION表示连接引用的数据在逻辑上和物理上一致的点。 如果遇到错误,可以回滚在BEGIN TRANSACTION之后进行的所有数据修改,以将数据恢复到此已知的一致性状态。
所以没关系,如果你重视条款或分开DML,一切都会失败..
我想知道我是否使用具有多个值的单个INSERT语句,是否确保在一个事务中插入2行?
即使你不使用这两个条款之间的整个陈述,逻辑上也只能在一个交易中
此外,values子句只是语法糖,它作为单独的插入语句工作,你可以从下面的截图中看到相同的