C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码抛出transactionAbortedException,消息“事务已中止”,内部transactionPromotionException,消息“尝试提升事务时失败”:

using ( transactionScope transactionScope = new transactionScope() )
    {
        try
        {
            using ( MyDataContext context = new MyDataContext() )
            {
                Guid accountID = new Guid( request.QueryString[ "aid" ] );
                Account account = ( from a in context.Accounts where a.UniquEID.Equals( accountID ) SELEct a ).SingLeorDefault();
                IQueryable < My_Data_Access_Layer.Login > loginList = from l in context.Logins where l.AccountID == account.AccountID SELEct l;

                foreach ( My_Data_Access_Layer.Login login in loginList )
                {
                    MembershipUser membershipUser = Membership.GetUser( login.UniquEID );
                }

                [... lots of deleteAllOnSubmit() calls]

                context.SubmitChanges();
                transactionScope.Complete();
            }   
        }

        catch ( Exception E )
        {
        [... reports the exception ...]
        }
    }

在@L_957_1@membership.GetUser()时发生错误.

我的连接字符串是:

<add name="MyConnectionString" connectionString="Data source=localhost\sqlEXPRESS;Initial Catalog=MyDatabase;Integrated Security=True"
   providerName="System.Data.sqlClient" />

read的一切都告诉我,transactionScope应该神奇地应用于会员电话.用户存在(否则我希望返回null.)

解决方法

transactionScope类掩盖了异常.很可能发生的事情是该范围内的某些内容失败(抛出异常),而transactionAbortedException只是当控件退出using块时发生的副作用.

尝试将transactionScope中的所有内容包装在try-catch块中,并在catch中重新抛出,并在那里设置断点;你应该能够看到真正的错误是什么.

另一件事,transactionScope.Complete应该是在包含transactionScope的using块结束之前执行的最后一个语句.在这种情况下,你可能应该没问题,因为之后你实际上并没有做任何工作,但是在内部范围内调用Complete会导致更多@R_375_10197@的代码.

更新:

既然我们知道内部异常是什么(失败促进交易),那么更清楚的是发生了什么.

问题是在transactionScope中,实际上是在用GetUser打开另一个数据库连接.成员资格提供者不知道如何重新使用您已经打开的DataContext;它必须打开自己的连接,当transactionScope看到它时,它会尝试升级到分布式事务.

它失败了,因为您可能在Web服务器,数据库服务器或两者上都禁用了MSDTC.

如果要打开两个单独的连接,则无法避免分布式事务,因此实际上有几种解决此问题的方法

>在transactionScope外部移动GetUser调用.也就是说,首先从会员提供者“读取”用户到列表中,然后在实际需要开始修改启动事务.
>完全删除GetUser调用并直接从数据库,同一DataContext或至少相同的连接读取用户信息.
>在参与交易的所有服务器上启用DTC(当事务提升时,@L_262_31@将受到影响).

我认为选项#1在这种情况下将是最好的;您需要从会员提供商处读取的数据在您阅读它和开始交易的时间之间进行更改是不太可能的.

大佬总结

以上是大佬教程为你收集整理的c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException全部内容,希望文章能够帮你解决c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。