【问题标题】:Will this transaction be rolled back if errors happens如果发生错误,此事务是否会回滚
【发布时间】:2016-02-17 02:35:55
【问题描述】:

我有一个要提交的事务,但不确定是否会在任何失败时回滚。我知道我可以在 c# 中使用 TransactionScope,如果发生错误,一切都会回滚。但我不太确定存储过程中的事务。所有在线示例都使用ROLLBACK 关键字进行回滚。如果我没有 ROLLBACK 关键字会怎样?

CREATE PROCEDURE CreatePost
    @type INT,
    @name VARCHAR(500)
AS
BEGIN
    DECLARE @insertedId TABLE(Id INT)
    DECLARE @id INT

    BEGIN TRANSACTION

    INSERT INTO [Post] ([Name], [Type])
    OUTPUT inserted.Id INTO @insertedId
    VALUES (@name, @type)

    UPDATE [Tables] SET Ordinals =ordinals + 1
    WHERE Id = @tableId

    COMMIT
END

【问题讨论】:

  • 此问题与所选帖子不重复。我只是问如果发生错误,上述存储过程是否会自动回滚。
  • 重新打开。我不认为这是 this 的重复问题。
  • 您可以创建一个小测试,在比提出这个问题的时间更短的时间内为您提供答案。下次当您对简单事物的行为方式有疑问时,请记住这一点。

标签: sql sql-server sql-server-2014


【解决方案1】:

是的,如果事务没有达到COMMIT 语句,它会自动回滚。

这是一个简单的例子

样本表

create table tt(id int)

示例程序

CREATE PROCEDURE CreatePost
AS
BEGIN

    BEGIN TRANSACTION

    INSERT INTO tt values (1)

    select cast('ldfsfds' as int)

    COMMIT
END

执行过程并查询表

EXEC CreatePost    
select * from tt

结果

0 records

最终结果将是一个空表,假设在执行过程之前没有记录。

【讨论】:

  • 可能希望在您的示例中实际运行存储过程
  • @JoePhilllips:已更正。 :)
【解决方案2】:

存储过程在其自己的连接上下文中运行,并且在过程结束时连接将关闭。 由于您已经显式启动了事务,如果发生任何错误并且代码没有到达提交语句,它将自动回滚。

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 2011-02-08
    • 1970-01-01
    • 2019-08-24
    • 2010-11-30
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多