实体框架:如何在事务中放置多个存储过程?

c83*_*830 9 .net c# sql-server entity-framework entity-framework-4

我已经做了很多搜索,但找不到直接的anwser.

我有两个存储过程,它们都是导入到DBContext对象的函数

  1. INSERTA()
  2. InsertB()

我想把它们放在交易中.(即如果InsertB()失败,则回滚InsertA())

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

谢谢

Mar*_* N. 14

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

using(TransactionScope tranScope = new TransactionScope()) 
{
  InsertA();
  InsertB();

  tranScope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

出错时,将自动回滚事务范围.当然,您仍然需要处理异常并执行您的异常处理设计所指示的任何内容(日志等).但除非您手动调用Complete(),否则在using作用域结束时回滚事务.

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

这一点很重要,因为否则您需要在此操作中涉及的所有服务器上配置MSDTC(Web,最终中间层,sql server).因此,只要交易不被提升为分布式交易,您就可以了.

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

附加示例: 此处.