【发布时间】: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 不会给我那种控制权。
-
我可能是错的,但我认为您不能将多个服务调用进行事务调用,它们在单独的线程上运行。不,您不能选择参与事务的上下文。
标签: c# entity-framework wcf transactions entity-framework-6