我已经进行了很多搜索,但是找不到直接的答案。

我有两个存储过程,它们都被导入到DBContext对象中

  • InsertA()
  • InsertB()

  • 我想把它们交易。 (即,如果InsertB()失败,则回滚InsertA())

    我怎么做?我可以只声明一个TransactionScope对象并包装两个存储过程吗?

    谢谢

    最佳答案

    您需要在事务范围中注册您的操作,如下所示:

    using(TransactionScope tranScope = new TransactionScope())
    {
      InsertA();
      InsertB();
    
      tranScope.Complete();
    }
    

    出错时,事务范围将自动回滚。当然,您仍然需要处理异常,并按照异常处理设计的指示(日志等)执行所有操作。但是,除非您手动调用Complete(),否则当using范围结束时,事务将回滚。

    除非您在同一事务范围中打开其他数据库连接(请参阅here),否则事务范围不会被提升为分布式事务。

    要知道,这很重要,因为否则,您将需要在此操作涉及的所有服务器(Web,最终的中间层,SQL Server)上配置MSDTC。因此,只要不将该事务升级为分布式事务,就可以了。

    注意:
    为了微调您的事务选项,例如超时和隔离级别,请查看this TransactionScope constructor。默认隔离级别是可序列化的。

    附加样本: here

    关于c# - Entity Framework : How to put multiple stored procedures in a transaction?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11194143/

    10-10 16:24