栀子花开

追求完美

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
在.Net平台下作了一个利用微软MSDTC的模块,实现多数据库的更新。
接口定义如下:
public interface IDistributeTransaction
{
//开启
int StartTransaction();

//提交
int CommitTransaction();

//回滚
int RollBackTranstion();

//Sql语句执行
int ExecuteSql(string connectionstring,string SqlStr,out string ErrStr);

}
其目的是使用户调用方式类似ADO.Net提供的事务处理,手动显式调用。

具体实现类的一些基本设置如下:(接口实现在另外一个类,调用
DistributeTransaction实现分布式事务)
[ Transaction( TransactionOption.RequiredNew) ]
[ ObjectPooling(true, 5, 10) ]
public class DistributeTransaction:ServicedComponent
{
.......
.......

}

调用方写有如下代码:

int rt = m_DistributeTrans.StartTransaction();
if(rt == 0)//成功
{
rt = ExecuteSql(....);//更新A数据库
if(rt == 0)
{
rt = m_DistributeTrans.ExecuteSql(....);//更新B数据库
}

if(rt == 0)
m_DistributeTrans.CommitTransaction();//提交
else DistributeTrans.RollBackTranstion();//回滚
}

非常纳闷,两个Sql语句的执行所在分布式事务的GUID都一样,应该说明它们处于
同一上下文当中。然而,却会导致A、B数据库的状态
不一致;回滚后,A数据库依然更新成功。
望各位赐教!

posted on 2007-03-20 16:30  杨林  阅读(236)  评论(0编辑  收藏  举报