使用Entity Framework无法开始分布式事务

4
我正在执行以下代码时遇到错误:

我正在执行以下代码时遇到错误:

private bool _updateList(SysInfo _sysInfo, List<pList> _pList)
{
    try
    {

        foreach (var p in _pList)
        {
            _context.spUpdatePListApprovalFlow(p.countryID, _sysInfo.User.JobRoleID, p.src, p.id, p.status, _sysInfo.User.Username);
        }

        return true;
    }
    catch (Exception ex) //debug only
    {
        throw; //throws error to the main try catch
    }
}

错误

无法执行操作,因为OLE DB提供程序“MSDASQL”对于链接服务器“AS400_LINKEDSRV”无法开始分布式事务。

但是,当我在SQL Management Studio中运行存储过程时,一切都正常:

exec [dbo].[spUpdatePListApprovalFlow]
        @CountryID  = 123456,
        @UserTypeID = 23456,
        @Src = 1,
        @Id = '123456789',
        @Status = 30,
        @Username  = 'username'

我已经尝试了很多方法,但都没有得到答案...以下是我尝试过的几种方法:

  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED (将事务隔离级别设置为读取未提交的内容)
  • 在存储过程中插入多个事务

这个存储过程包括两个子存储过程。其中一个向应用程序数据库的表中写入数据,另一个更新as400中的表。

4个回答

3

请问,您能否提供EF6调用显式事务中存储过程的文档链接? - Mohammad Ali

1

好的,在半天的尝试之后,我终于解决了这个问题。

解决方法

将 Entity Framework 6 降级到 Entity Framework 5,分布式事务错误就消失了。

只需要注意,如果你要这样做,你需要在代码中更改一些 "using" (在数据模型中自动生成的代码中也是如此)。

EF 6 使用:

using System.Data.Entity.Core.Objects

EF 5 使用
using System.Data.Objects;

1
既然您已经确认了不同版本的EF表现不同,那么您可以提出另一个关于EF的非常好的问题,并找到问题的根源。 - Vladimir Baranov

0

请参考Microsoft关于联接服务器的页面

您的系统管理员和/或DBA可能需要进行更改,以解决缺少到您的AS/400服务器的联接服务器定义的问题。

另一个可能的问题是,IBM的AS/400服务器缺乏OLE DB数据源的软件支持。这也是系统管理人员可能需要解决的问题。


0
如果您不需要分布式事务,可以尝试在链接服务器的设置中禁用它们:
EXEC master.dbo.sp_serveroption 
    @server=N'AS400_LINKEDSRV', 
    @optname=N'remote proc transaction promotion', 
    @optvalue=N'false'

我不是 DBA,我只有数据库的管理员权限。但这样做能解决问题吗?请问关闭它会有什么影响?如果确实需要,我可以要求他们这样做。 - bmvr
这将更改在您的SQL Server实例中链接服务器AS400_LINKEDSRV的设置。它不会触及远程AS400服务器。 - Vladimir Baranov
1
如果启用了分布式事务,并且一切都已配置和正常工作,则事务跨越两个服务器,就像它是单个服务器一样。如果事务未分布,则您的SQL Server负责将仅本地更改包装到事务中,而远程服务器则负责其自己的更改。可能会出现一个服务器上的更改被持久化,而另一个服务器上的更改没有被持久化。这是否可接受取决于您的存储过程所做的事情。 - Vladimir Baranov
另一个问题是,我的另一个项目的同事正在做和我一样的事情,但他正在使用较旧版本的Entity Framework(4.0),而我正在使用版本6。您认为由于版本问题,连接器可能会出现问题吗? - bmvr
抱歉,@BrunoRodrigues,我从未使用过Entity Framework。当然,由于查询在SSMS中运行良好,所以问题出在您的C#代码和/或Entity Framework选项上。也许EF会启动一些额外的事务,其中不仅包含此SP,还包含其他内容,这会导致事务升级为分布式。也许EF默认将所有事务都作为分布式启动,并且只有在实际使用两个不同的服务器时才会看到问题。您可以尝试深入了解EF设置,但我无法帮助EF。也许其他人会添加一个特定于EF的答案。 - Vladimir Baranov
谢谢你的帮助@VladimirBarov。无论如何,问题出在EF上,我已经将它从6降级到5,现在它可以正常工作了。 - bmvr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接