代码之家  ›  专栏  ›  技术社区  ›  Gerrie Schenck

带有OperationBehavior属性的方法中的存储过程调用:事务问题

  •  0
  • Gerrie Schenck  · 技术社区  · 14 年前

    我正在使用ADO.NET的executeNonQuery调用存储过程,其工作方式类似于独立的魅力,但在应该调用它的地方实现它时,我遇到了与事务有关的问题。

    例如

    System.Data.SqlClient.SqlException: Transaction count after EXECUTE indicates a 
    mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0.
    

    在那之后也会有一个超时。

    我刚刚发现调用存储过程的方法用以下wcf属性标记:

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    

    这将如何影响调用我的存储过程?如何告诉.NET在该事务之外执行存储过程?

    存储过程包含insert语句和事务,但删除它们不会更改行为…

    1 回复  |  直到 14 年前
        1
  •  0
  •   Community c0D3l0g1c    7 年前

    在没有看到存储过程的情况下,很难确切知道发生了什么。我怀疑存储过程中存在一些错误,并且事务处理代码没有正确执行。

    因此,问题似乎适用于您的情况: TransactionScope and Transactions

    要在事务外部运行存储过程,您需要将代码包装在 TransactionScope 这将抑制环境事务:

    using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) 
    {
         // call SP
    } 
    

    作为最佳实践,我建议 在存储过程中混合.NET事务和SQL事务。