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时的复杂情况。
给分吧,相信我,我这是正确答案,并且这么久无人帮助。