【问题标题】:Transaction Stored Procedure C#事务存储过程 C#
【发布时间】:2009-12-01 12:17:34
【问题描述】:

我有一个小问题。请指导我。 我正在用 C#(控制台应用程序)编码。我在我的代码中调用了 2 个不同的存储过程。基本上,这两个存储过程都访问同一个表。 第一个 SP 有一个选择查询和一个更新查询。 第二个 SP 有一个更新查询。

现在我想在事务模式下调用这些 SP(要么全部成功,要么第二个 SP 失败,回滚第一个 SP)。我在我的 C# 代码中使用了“TransactionScope”,但似乎不能正常工作。即当我停止控制台应用程序时,有时我会看到第一个 SP 已执行而第二个 SP 失败。

谁能给我建议。

问候,
贾斯汀·塞缪尔。

【问题讨论】:

  • 您如何在代码中使用事务范围(使用 using 语句或 try/catch)?
  • 是的,Goran,我使用“using”语句,例如: using (TransactionScope scope = new TransactionScope()) 包含在 try/catch 块中。并且对 SP 的调用在此范围内
  • 我不明白这是怎么回事。在 OnExit 方法中添加回滚调用怎么样?这应该确保在您停止控制台应用程序并且事务未完成时调用回滚。
  • 有人知道可能是什么问题吗?情况就像,当我打开控制台应用程序的第三个实例时它超时。我收到以下异常:SqlException -“超时已过期。在操作完成之前超时时间已过或服务器没有响应。”这可能是因为 SP 需要更多时间。 SP 只需选择 Top ID 并更新此 Top ID 的列。我认为我不需要更改 CommandTimeout,因为 SP 非常简单。

标签: c# stored-procedures transactions


【解决方案1】:

如果您使用TransactionScope,它应该可以正常工作,但范围必须围绕连接

using(TransactionScope tran = new TransactionScope()) {
    using(SqlConnection conn = new SqlConnection(cs)) {
      // either multiple commands on one connection
      using(SqlCommand cmd = conn.CreateCommand()) {
        // etc
      }
      using(SqlCommand cmd = conn.CreateCommand()) {
        // etc
      }
    }
    using(SqlConnection conn = new SqlConnection(cs)) {
      // or a separate connection
      using(SqlCommand cmd = conn.CreateCommand()) {
        // etc
      }
    }
    tran.Complete();
}

an edge case where a TransactionScope can fail 导致后面的命令在没有事务的情况下运行。

或者,对于单个连接,使用SqlTransaction,但请记住将事务(来自连接)与每个命令相关联。

【讨论】:

  • 马克,我有点困惑。我一次取一排。使用两个 SP 进行一些处理。这个单独的行处理在 TransactionScope 中。如果我在每个事务中编写 SqlConnection ,则意味着每个事务中都有单独的连接。如果我错了,请提出建议!
  • 最后,我必须在每个事务中创建一个单独的连接。优秀的马克!!!感谢 Marc 和 Goran 的支持。干杯!!!
  • 由于可序列化的隔离级别,听起来你正在阻塞自己。
  • Marc,我在打开了两个控制台实例的情况下工作得非常好。交易顺利进行。但是,当我打开第三个控制台应用程序时,我只是超时。这个需要调查! :)
猜你喜欢
  • 2011-09-09
  • 2015-03-24
  • 2012-09-26
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多