【问题标题】:INSERT SELECT Statement and Rollback SQLINSERT SELECT 语句和回滚 SQL
【发布时间】:2011-03-04 04:48:19
【问题描述】:

我正在使用 MS SQL Server 2008 创建一个使用 INSERT SELECT 语句的查询:

插入 TABLE1 (col1, col2) 从 TABLE2 中选择 col1, col2

现在这个查询的执行是在一个事务中:

伪代码:

try  
{  
    begin transaction;  
    query;  
    commit;  
}  
catch
{
rollback; 
}

如果 TABLE2 有大约 40m 行,在对 TABLE1 进行插入的那一刻,如果在 INSERT 中间出现错误,INSERT SELECT 语句会自己回滚还是我需要使用事务保持数据完整性?

有必要使用事务吗?或 SQL SERVER 它自己为这种类型的句子使用事务。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      语句是原子的——如果语句没有完成,什么都不会改变。此外,documentation 有一些关于插入语句期间失败的更具体信息:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2019-08-24
          • 1970-01-01
          • 2016-07-02
          • 2012-10-18
          • 2010-11-09
          • 2011-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多