在.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数据库依然更新成功。
望各位赐教!
接口定义如下:
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数据库依然更新成功。
望各位赐教!