错误方法:
using (TransactionScope scope = new TransactionScope())
{
try
{
ws.WebService1 webs = new 分布式事务_DEMO.ws.WebService1();
webs.HelloWorld();//这里执行成功,远程数据库已插入数据。失败则回滚
exeSql();//这里执行失败,回滚并不会回滚远程数据库的数据。成功则提交事务。
scope.Complete();
}
catch (Exception ex)
{
//throw new Exception("发送信息异常,原因:" + ex.Message);
}
finally
{
//释放资源
scope.Dispose();
}
}
正确方法:
using (TransactionScope scope = new TransactionScope())
{
try
{
exeSql();//这里执行失败,则直接回滚,成功则继续
ws.WebService1 webs = new 分布式事务_DEMO.ws.WebService1();
webs.HelloWorld();//这里执行成功则远程数据库已插入数据并且提交事务。
//如果失败这里的事务也回滚
scope.Complete();
}
catch (Exception ex)
{
//throw new Exception("发送信息异常,原因:" + ex.Message);
}
finally
{
//释放资源
scope.Dispose();
}
}
以上方法在一定程度上实现数据同步。但并不是真正意义上的分布式事务。因为如果在scope.Complete();断线或者出现其它什么故障终止了。此时远程数据库已经有数据,而本地并没有,当然这种情况是比较极端的。
另外引用大牛"SP1234"的话:“我想一般的应用,你没有必要考虑所谓分布式事务这种过于技术化的概念。你可以在本地的数据库事务中去访问远程web service,如果出错就会回滚好了(就是我上面实现的方法!)。
如果这种做法性能实在是不佳(所谓理论上的分布式事务的性能也一样很差),你可以改为业务思路,一个后台线程一点一点地、在前台有空闲时做数据同步,这就够了。”