在事务中调用WebService一定程度上实现数据同步

错误方法:
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,如果出错就会回滚好了(就是我上面实现的方法!)。
如果这种做法性能实在是不佳(所谓理论上的分布式事务的性能也一样很差),你可以改为业务思路,一个后台线程一点一点地、在前台有空闲时做数据同步,这就够了。”

原文地址:https://www.cnblogs.com/zhuawang/p/2116747.html