同步更新两个数据库,如何使用事务?(50分)

  • 主题发起人 主题发起人 gwcwt123
  • 开始时间 开始时间
G

gwcwt123

Unregistered / Unconfirmed
GUEST, unregistred user!
如果要同时更新两个数据库服务器中的数据,出错时就撤消对两个数据的所有操作,避免只对一个数据库或部分数据更新,导致的不一致问题,听听大家处理此方面的问题的经验。<br><br>当前我是用 OPDATASOURSE 连接进行两个数据库的操作,操作正常,但增加事务后就出了很多问题,要配置一些安全访问权限等等,到最后还是没搞好,郁闷中。。
 
try<br>&nbsp; starttrans1<br>&nbsp; starttrans2<br>&nbsp; commit1;<br>&nbsp; commit2<br>except<br>&nbsp; rollback1<br>&nbsp; rollback2
 
大概说明下我这的情况:<br>本地服务器程序用到的控件:ADOCon ADOQ1<br>本地服务器和远程服务器都用SQL Server<br>try<br>&nbsp; ADOCon.BeginTrans;<br>&nbsp; with ADOQ1 do<br>&nbsp; begin<br>&nbsp; &nbsp; // 以下只简写执行的SQL语句用于说明功能,分析问题时不用考虑SQL语法<br>&nbsp; &nbsp; delete from opendatasource(远程数据库服务器).指定表; // 删除指定表记录<br>&nbsp; &nbsp; // 将本地表上传到指定的远程数据库服务器<br>&nbsp; &nbsp; insert into opendatasource(远程数据库服务器).指定表 from 本地表; &nbsp; <br>&nbsp; &nbsp; // 删除本地表已上传数据<br>&nbsp; &nbsp; delete from 本地表;<br>&nbsp; end;<br>&nbsp; ADOCon.CommitTrans;<br>except<br>&nbsp; ADOCon.RollbackTrans;<br>end;<br><br>出现的问题:需要配置两地服务器,总提示没有建立信息连接等,还有其它类似提示,都是要求检查配置两地服务器的,到现在还是有错<br><br>期望的回复:(1)我目前采用的方法是否可行,可行的话,这个服务器的配置具体都要配置什么,会不会很复杂; (2)处理类似我说的这个问题,有没有其它更好的方法来保证两地服务器在更新时数据的同步
 
LZ是什么DB,如果是ORACLE,可以建立一个DBLINK,这样只通过操作一个数据库就可以扔到一个事务中了,达到同步。<br>否则就需要写代码了,设一个事务的回滚点,用来保存所有的数据操作之前的DATA,这样,如果一出错,则返回这个点,更新回去。(此为我的想法哈,不太成熟。。。)
 
本地服务器和远程服务器都用SQL Server
 
SQL Server本身具有处理异步事务的能力
 
楼上的能具体说明下吗,我现在急需要了解的是如何使用,感谢这么多朋友关注中。。
 
不是那样 如果是几个库,就要用几个transaction 也就是几个connection ,看你上面的只有一个,transaction 是基于 connection 的哪怕 你是一个库,用2个connection 也可以
 
谢谢楼上建议,我先试下看效果,如果可行,暂定为一种方法:<br>1、当对多个数据库同时操作可以为每个数据库建立一个connection,来实现事务控制<br><br>还有没有其它处理方法,有没有大侠使用过类似我处理中方法,给些建议
 
可以用异步就用异步处理<br>不能用异步应该用补偿事务来做<br>msn:ball_cao@hotmail.com
 
请教 ball_cao 补偿事务 怎么讲?
 
用伪代码举个例子<br>try<br>&nbsp; starttrans1<br>&nbsp; commit1;<br>except<br>&nbsp; rollback1<br>end<br>try<br>&nbsp; starttrans2<br>&nbsp; commit2;<br>except<br>&nbsp; rollback2<br>&nbsp; doPachtran;//第二个提交失败时这里做一个补偿事务将第一个事务的提交还原<br>end<br><br>这是一种比较简单的处理分布式数据的异步事务处理模式 不过对数据库和程序的设计有比较高的要求<br>我认为需要使用分布式数据的情况是有限的,尤其是同构数据库的分布式几乎可以说是不必要的 应该先考虑一下将分布式数据换成集中式数据。
 
何为补偿问题呢?
 
假如有两个数据库服务器A、B,每次并不是单独处理完A再单独处理B,而是A、B要联合操作,如:将B中的数据导入到A,如果采用两个数据集连接分开,这个导入又该如何写简单呢?<br>我原来是这样写的:<br>try<br>&nbsp; ADOCon.BeginTrans;<br>&nbsp; with ADOQ1 do<br>&nbsp; begin<br>&nbsp; &nbsp; // 以下只简写执行的SQL语句用于说明功能,分析问题时不用考虑SQL语法<br>&nbsp; &nbsp; delete from opendatasource(远程数据库服务器).指定表; // 删除指定表记录<br>&nbsp; &nbsp; // 将本地表上传到指定的远程数据库服务器<br>&nbsp; &nbsp; insert into opendatasource(远程数据库服务器).指定表 from 本地表; &nbsp; <br>&nbsp; &nbsp; // 删除本地表已上传数据<br>&nbsp; &nbsp; delete from 本地表;<br>&nbsp; end;<br>&nbsp; ADOCon.CommitTrans;<br>except<br>&nbsp; ADOCon.RollbackTrans;<br>end;<br>不加事务可以,这种写法也比较简单,操作方便,但就是加事务问题多多,要配置N多,也没搞定,不知道什么原因?
 
这就是我说的分布式数据的必要性问题了<br>如果你的A和B数据库在业务上有如此紧密的联系,那么为什么要做分布式数据呢?<br>如果你一定要做分布式数据,那么至少数据的划分存在很大的不合理,否则不会在一个业务逻辑中出现这么复杂的数据交互。<br><br>再退一步,上面这个例子你也可以将A数据库的操作做完再做对B的操作 如果对B的操作失败则用补偿事务回滚对A的操作:<br>try<br>&nbsp; ADOCon.BeginTrans;<br>&nbsp; with ADOQ1 do<br>&nbsp; begin<br>&nbsp; &nbsp; // 以下只简写执行的SQL语句用于说明功能,分析问题时不用考虑SQL语法<br>&nbsp; &nbsp; sqllist.add(delete from opendatasource(远程数据库服务器).指定表); // 删除指定表记录)<br>&nbsp; &nbsp; // 将本地表上传到指定的远程数据库服务器<br>&nbsp; &nbsp; sqllist.add(insert into opendatasource(远程数据库服务器).指定表 from 本地表); &nbsp; <br>&nbsp; &nbsp; // 删除本地表已上传数据<br>&nbsp; &nbsp; delete from 本地表;<br>&nbsp; end;<br>&nbsp; ADOCon.CommitTrans; <br>except<br>&nbsp; ADOCon.RollbackTrans;<br>end;<br>try<br>&nbsp; ADOCon2.BeginTrans;<br>&nbsp; //循环执行sqllist中的语句<br>&nbsp; ADOCon2.commit;<br>except<br>&nbsp; 做补偿事务回滚对1的提交,插入刚才删除的记录。<br>&nbsp; ADOCon2.RollbackTrans;<br>end
 
呵呵 ,喜欢卖弄概念哈
 
后退
顶部