Microsoft分布式事务处理协调器(MS DTC)已取消分布式事务

时间:2012-07-16 22:53:44

标签: sql-server-2008 sql-server-2005 .net-2.0 asp.net-2.0 linked-server

背景 我们有一个在.NET framework 2.0下开发的网站,它使用了一个用Sql Server 2005创建的数据库。我们还有一个在.NET framework 4.0下开发的网站,这个网站使用了一个用Sql Server 2008创建的数据库。链接两个数据库(从Sql Server 2005到Sql Server 2008)在Sql Server 2005数据库上创建“链接服务器”。

情境: 当我们在Sql Server 2005中托管的数据库上创建记录时,我们有这样的事务序列: 将记录插入Sql Server 2005数据库中托管的表中。 此插入在插入后执行触发器。 在触发器内部,我们执行存储过程(托管在Sql Server 2008数据库中),并使用“链接服务器”执行此存储过程。 此存储过程执行插入Sql Server 2008数据库中托管的表。 如果我们使用Sql Server Management Studio 2005手动执行插入Sql Server 2005数据库中托管的表,一切都会很好地执行,但如果我们尝试使用网站的UI(.NET 2005)创建记录,我们得到这个错误:

无法提交当前事务,也无法支持写入日志文件的操作。回滚交易。 Microsoft分布式事务处理协调器(MS DTC)已取消分布式事务。

有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:0)

我发现在触发器中执行此类代码非常危险。我会考虑删除触发器并创建执行所述操作的过程。

要正确测试所有内容,您应该在两台服务器上的一个事务中调用DML操作,或者您应该通过调用“begin distributed tran”显式地开始分布式事务。如果您只是更新其他服务器上的内容(只有1个操作),那么您没有使用分布式事务,并且测试不正确。