sql-server - SQL服务器事务

标签 sql-server transactions

我有 2 个 sql server 语句。

Delete from hello where id=1

Insert into hello name,age 
select name ,age from welcome

如果其中任何一个失败,则不应进行删除或插入。

我尝试过交易

Begin Tran

    Delete from hello where id=1

    Insert into hello (name,age) 
    select name ,age from welcome


Commit Tran

但是如果其中一个出错了,另一个就犯了。我是不是错过了什么。

2 delete statements

BEGIN TRY
    BEGIN TRAN;


  delete from hello where id=1

  delete from hello where id=19  // here id=19 doesn't exist

    COMMIT TRAN;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;

此处 id=19 不存在,因此应该回滚,但它正在删除 id=1。它是提交而不是回滚。在这个场景中我应该做什么..

最佳答案

But if either one is gone wrong .Other one is committed.Am i missing something.

是的,您缺少错误处理。根据错误的不同,T-SQL 批处理可能会在错误发生后继续执行后续语句,包括提交。下面是一个结构化错误处理示例,可以避免这种情况。

BEGIN TRY
    BEGIN TRAN;

    DELETE FROM hello WHERE id=1;

    INSERT INTO hello (name,age) 
    SELECT name ,age FROM welcome;

    COMMIT TRAN;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;

更新:

如果您有其他不是 SQL Server 错误的业务规则,您可以检测 T-SQL 代码中的条件并引发错误以调用 CATCH block 并回滚:

BEGIN TRY
    BEGIN TRAN;

    DELETE FROM hello WHERE id=1;

    IF @@ROWCOUNT < 1
    BEGIN
        RAISERROR('Row not found', 16, 1);
    END;

    INSERT INTO hello (name,age) 
    SELECT name ,age FROM welcome;

    COMMIT TRAN;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;

关于sql-server - SQL服务器事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40609468/

相关文章:

sql-server - SQL 在编码时接受多个 '+' 但不产生运行时错误,为什么?

sql-server - MS SQL Server 2008 - 从 MySQL 迁移时出现困惑 re : "select XYZ from TABLE"

java - 在 GAE 上检索/记录多个实体的最便宜的方法

mysql - 在事务中插入多行,如果其中一行失败,则插入其余行

ruby - 如何使用 PG Ruby Gem 有条件地回滚事务

mysql - 如何在事务中提交单个查询

java - 重新抛出已检查的异常

sql - 新手 SQL 更新问题

sql-server - 我可以从具有不同数据类型的键值表创建动态数据透视查询吗?

sql-server - 30 天分区中的 SQL 重新接纳