【问题标题】:Triggering a rollback inside transactionscope C#在事务范围内触发回滚 C#
【发布时间】:2018-08-14 01:18:42
【问题描述】:

我目前正在开发一个存储过程,该过程将对数据库表执行几次插入操作,我想测试一下它是否可以以我希望的方式返回受影响的总行数。我正在事务范围内从我的 C# .NET 代码调用这个存储过程。

然而,我的问题是如何在存储过程执行后触发回滚并且受影响的行显示在控制台上?

我不允许分享我的代码,但我可以给出它的伪代码,因为它很简单:

using(TransactionScope scope){
  //Run the procedure and save the return value in a variable
  int rowsAffected = MyStoredProcedure();

  //Print the value in the variable
  Console.WriteLine(rowsAffected);

  //Ideally, I want to perform the rollback here.
  scope.Complete();
}

简单地抛出某种异常就足够了,还是有更好的方法来触发回滚?

【问题讨论】:

  • 在这种情况下,如下面的回答所述,您可以省略Complete。如果由于某种原因您需要在 using 块结束之前回滚 - 只需调用 scope.Dispose()
  • 另外,请注意默认的TransactionScope 隔离级别是可序列化的,这很容易出现死锁。除非您特别需要可序列化,否则请考虑指定 TransactionOptions.IsolationLevel.ReadCommitted
  • @DanGuzman 是的,我知道并已实施。我在想,如果我保持代码简单易读,会更容易。

标签: c# .net sql-server rollback transactionscope


【解决方案1】:

只要您不调用“完成”,它就不会被提交。删除它,当您离开使用范围时,它将被回滚:

using(TransactionScope scope)
{
  //Run the procedure and save the return value in a variable
  int rowsAffected = MyStoredProcedure();

  //Print the value in the variable
  Console.WriteLine(rowsAffected);

  //Don't call Complete() and it will be rollbacked
  //scope.Complete();
}

【讨论】:

    【解决方案2】:

    由于您使用的是存储过程。为什么不将事务保存在存储过程本身中。那么你就不用担心在c#代码中处理回滚了

    【讨论】:

    • 更多的是用于测试目的,而不是代码中的回滚处理。我不想删除我的数据库表然后再次恢复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多