首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

TransactionScope分布式事务出错:msdtc已经取消了分布式事务。该怎么解决

2013-11-23 
TransactionScope分布式事务出错:msdtc已经取消了分布式事务。using (TransactionScope scope new Transa

TransactionScope分布式事务出错:msdtc已经取消了分布式事务。


using (TransactionScope scope = new TransactionScope())
                {
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(Configuration.ConnectionString))
                    {
                        bulkCopy.DestinationTableName = "GeographyPerformanceData";
                        bulkCopy.BatchSize = geoPerformTable.Rows.Count;
                        bulkCopy.WriteToServer(geoPerformTable);

                        bulkCopy.Close();
                    }
                    //批量更新(使用了SqlTranaction事务)
                    if (lstUpdateSql.Count > 0)
                    {
                        int updatedCount = KPIPerformanceDataBLL.Instance.BatchUpdate(lstUpdateSql);
                        if (updatedCount == 0)
                        {
                            ri.Success = false;
                            ri.Message = "导入失败!请重试。";
                            return ri;
                        }
                    }

                    //同步地区目标数据到经理信息,在sql语句中使用了tran事务
                    for (int rowIndex = 0; rowIndex < performData.Rows.Count; rowIndex++)
                    {
                        geographyCode = performData.Rows[rowIndex][4].ToString().Trim();
                        try
                        {
                            GeographyPerformanceDataBLL.Instance.SyncGeoTargetToManager(PerformanceEvalInfo.Id, geographyCode);

                        }
                        catch (Exception ex)
                        {
                            ri.Success = false;
                            ri.Message = "同步地区目标数据到经理信息出错!\n内部错误说明:" + ex.Message;
                            return ri;
                        }
                    }



                    //commit transaction
                    scope.Complete();
                }



asp.net程序。
以上代码有在scope内部有三个任务,批量insert,批量update,还有最后一个是带sql tran的
存储过程。
每个部分都可以单独执行,(就是说,代码或sql无错)。
存储过程如下:

ALTER PROCEDURE [dbo].[INSERTKPIDATAFROMGEODATA]
(
@EMPLOYEEID UNIQUEIDENTIFIER, --经理ID
@GEOGRAPHYID UNIQUEIDENTIFIER,--负责地区ID
@EVALUATIONID UNIQUEIDENTIFIER--考核ID

--'40911A5E-2958-4790-BA2F-A701104B501E','0FAC819B-68ED-4A4E-AD74-31F44B6BAC80','C55B73DE-50D9-4391-8784-E60753C56BBF'
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
        BEGIN TRAN  
//一些操作,绝无语法及数据错误。
COMMIT TRAN
RETURN 1
END TRY
BEGIN CATCH
ROLLBACK TRAN
RETURN 0
END CATCH
END

但是每次执行都是在执行了存储过程之后报错

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

前提是客户端和服务端均已经配置了MSDTC,对此错误无从下手,望有经验的高手帮忙解决!!!谢谢!! sql 事务? asp.net 分布式事务
[解决办法]
很简单,删除try catch,放弃sqltran,说实话,sqltran在非纯T-SQL情况下用处不大。
因为sqlserver不能智能匹配begin和commit,特别是存在xact_abort为ON时的复杂情况。
给分吧,相信我,我这是正确答案,并且这么久无人帮助。

热点排行