我正在创建使用MS SQL Server 2008使用INSERT SELECT语句的查询:
INSERT INTO TABLE1(col1,col2)SELECT col1,col2 FROM TABLE2
现在,此查询的执行是在事务中:
伪代码:
try
{
begin transaction;
query;
commit;
}
catch
{
rollback;
}
如果TABLE2有大约40m的行,在TABLE1上插入的那一刻,如果INSERT中间有错误,INSERT SELECT语句本身是否会回滚,或者我需要使用事务保持数据完整性?
有必要使用交易吗?或SQL SERVER它自己使用这种句子的事务。
答案 0 :(得分:2)
单个SQL命令是原子的。它将完成或回滚。
如果已完成,则包装该命令的事务可以将其回滚。如果它在事务之外,则在完成时提交。
答案 1 :(得分:2)
语句是原子的 - 如果语句没有完成,则不会改变任何内容。此外,documentation还有一些关于插入语句中失败的更具体信息:
如果INSERT使用SELECT加载多行,则任何违反由加载值引起的规则或约束都会导致整个语句停止,并且不会加载任何行。
答案 2 :(得分:1)
在这种情况下,SQL Server执行隐式事务。 insert语句是原子的,要么整个语句都会成功,要么在失败时回滚。还记得ACID吗?