在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?

Posted

技术标签:

【中文标题】在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?【英文标题】:In EF6 is it possible to perform a transaction across service calls with a context per call structure?在 EF6 中,是否可以使用每个调用结构的上下文跨服务调用执行事务? 【发布时间】:2015-12-13 01:02:33 【问题描述】:

我有一个结构,其中包含对服务器上 WCF 服务的多个服务调用。每次调用我都实例化了多个 DbContexts。我想将其中一些调用分组到服务器上的单个事务中,同时排除其他可能同时发生的调用。这可能吗?

我的上下文都在单个服务器上的单个应用程序中进行管理,并且所有上下文都使用相同的连接字符串。

我正在寻找类似的东西

var transKey = transService.BeginTransaction(); // creates a transaction of some kind.
service1.Execute(transKey); // on the server places the execution within the specified transaction.
service2.Execute(transKey); // same here
transService.CommitTransaction(transKey); // Nothing happens until now (allowing other clients to freely utilize service1 without touching the transaction), the transaction occurs, and everything gets cleaned up.

但可以这么说,我可能会叫错树。找到解决此问题的任何帮助都会很有用。

编辑

我想要做的是有一个跨越多个服务调用的指定事务,但不是每个服务调用。我正在寻找一种创建事务的机制,然后决定“我想要这个 DbContext 动作和这个其他 DbConext 动作,而不是事务的这个 DbContext 动作部分”。然后有权持有该交易,直到我准备好执行它。我相信 TransactionScope 不会给我那种控制权。

我可能是错的,但 TransactionScope 似乎为每个连接创建一个事务,只要作用域处于活动状态,任何和每个 DbContext 操作都会汇总到事务中。我需要更多地控制某某交易的内容。

【问题讨论】:

我认为TransactionScope 可以解决问题msdn.microsoft.com/en-us/library/… 如果我实例化一个事务范围,所有上下文调用都会成为事务的一部分吗?假设第二个用户从单独的客户端调用 service1.Execute() 。如何确定第二个服务调用及其底层 dbcontext 调用不属于事务范围? 我相信它会使跨上下文的调用成为事务性的,是的,它在后台使用 MSDTC。多个服务调用,只要每个创建自己的上下文实例,就会有自己的事务。 啊,我明白了。我想要做的是有一个跨越多个服务调用的指定事务,但不是每个服务调用。我正在寻找一种创建事务的机制,然后决定“我想要这个 DbContext 动作和这个其他 DbConext 动作,而不是事务的这个 DbContext 动作部分”。然后有权持有该交易,直到我准备好执行它。我相信 TransactionScope 不会给我那种控制权。 我可能是错的,但我认为您不能将多个服务调用进行事务调用,它们在单独的线程上运行。不,您不能选择参与事务的上下文。 【参考方案1】:

我会使用分布式事务,但使用TransactionInterop.GetTransmitterPropagationToken 方法将事务令牌传递给您想要参与事务的服务调用。这也意味着您需要修改服务以接收事务 ID。另外,在跨多个应用域使用分布式事务时要小心,应用域必须保持活动状态,直到事务提交或回滚,否则事务将无法提交。

http://blogs.microsoft.co.il/sasha/2010/04/30/propagating-a-transaction-across-appdomains/

TransactionScope throws TransactionAbortedException when Disposed

http://blogs.msdn.com/b/florinlazar/archive/2008/02/20/flowing-or-propagating-transactions-in-net-blog-entry-under-construction.aspx

【讨论】:

以上是关于在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?的主要内容,如果未能解决你的问题,请参考以下文章

C# EF6 使用 Unity 对一个上下文进行多次异步调用 - Asp.Net Web Api

EF6 中使用复合键的每个具体类型 (TPC) 映射表

EF6基础系列(12)--- EF进行批量添加/删除

EF6 模型优先 - 实体类型不是当前上下文模型的一部分

我是不是必须在每个剃须刀页面模型中调用数据库?

EF6基础系列(十)---离线场景保存实体和实体图集