2

我有 3 个关于 TransactionScopeOption.Required 的问题,这让我发疯,我在网上找不到他们的答案。

A.我很难思考什么时候我必须编写这段代码?为什么我不应该将 DoSomething2() 放在 TransactionScope4 之外的 TransactionScope3 中?
B.在这之后:TransactionScope4.Complete(),TransactionScope3 也是 Complete 因为它的 TransactionScope 相同,对吧?
C.在WCF中,当我在客户端使用TransactionScope并在其中调用一些服务的方法时,每个方法都使用我在客户端创建的TransactionScope还是创建新的?为什么要创造一个新的?如果方法创建新方法,这就是为什么属性:TransactionAutoComplete 存在吗?

using (TransactionScope TransactionScope3 = new TransactionScope())
            {
                Service1.DoSomething1();
                using (TransactionScope TransactionScope4 = new TransactionScope(TransactionScopeOption.Required))
                {
                    Service1.DoSomething2();
                    TransactionScope4.Complete();
                }
                TransactionScope3.Complete();
            }
4

1 回答 1

2

这里记录了一个关键句子:

如果 TransactionScope 对象创建了事务,则资源管理器之间的实际提交工作发生在 End Using 语句中。如果它没有创建事务,那么只要 CommittableTransaction 对象的所有者调用 Commit,就会发生提交。

因此,要回答问题B,不,您的调用TransactionScope4.Complete()不会提交事务,因为该 TransactionScope 实例将重新使用TransactionScope3的事务。

回答C,如果你指出 WCF 服务需要一个事务,那么如果客户端上已经创建了一个现有的 TransactionScope,那么 WCF 将不会启动一个新事务(并且它不会在服务调用结束时提交,例如原因同上)。但是,如果客户端没有打开的 TransactionScope,那么 WCF 将启动一个新的,并在服务调用结束时自动提交或回滚。

于 2012-04-26T22:57:55.373 回答