INSERT SELECT语句和回滚SQL

时间:2010-06-15 20:57:24

标签: sql sql-server

我正在创建使用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它自己使用这种句子的事务。

3 个答案:

答案 0 :(得分:2)

单个SQL命令是原子的。它将完成或回滚。

如果已完成,则包装该命令的事务可以将其回滚。如果它在事务之外,则在完成时提交。

答案 1 :(得分:2)

语句是原子的 - 如果语句没有完成,则不会改变任何内容。此外,documentation还有一些关于插入语句中失败的更具体信息:

  

如果INSERT使用SELECT加载多行,则任何违反由加载值引起的规则或约束都会导致整个语句停止,并且不会加载任何行。

答案 2 :(得分:1)

在这种情况下,SQL Server执行隐式事务。 insert语句是原子的,要么整个语句都会成功,要么在失败时回滚。还记得ACID吗?