论坛首页 Java企业应用论坛

如何在web系统中实现跨系统调用与事务补偿

浏览 20364 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (5)
作者 正文
   发表时间:2011-07-10  
看了以上这么多的回答
jta是先不会考虑,因为本身就是两个独立的系统,并且也不想把另A系统中的逻辑拿到B系统来实现。
JMS没有用过,去查一下。
godson_2003 说的支付宝付款,只用过支付宝,但它具体怎么工作的,还不得知,因为没有碰到银行业务。

我觉得银行对帐这种处理模式是现阶段最能符合要求的,在以后的系统中涉及到这种处理模式可以考虑下。

taolei0628 说得很清楚,因为这本身就是两个独立的系统,虽然两个系统都是我们做的,不过不能仅仅因为可以同时操作两个系统,就使用JTA,JTA要求在一个系统中把另一个系统的逻辑都给做了,就是同一个系统访问两个数据库,而且需要操作另一个数据库的数据,这已经违背了系统独立的要求了(因为本身就是独立的系统)。



0 请登录后投票
   发表时间:2011-07-10  
B系统出现异常写日志,然后定期触发回写A系统,简单就是这么处理了。也可以采用楼上几种方式。
0 请登录后投票
   发表时间:2011-07-11  
我之前遇到一个类似于楼主的问题,但可能更为简单

try{
A逻辑

Reference B = new Reference();  //当时我做的是一个web service的接口

bool confirmState = B.confirm()

if(confirmState){
   commit;
else
   rollback;

A逻辑
}catch(){
   rollback;
}

本人新手 个人纯属意见,如有不对的地方 还望多多指正
0 请登录后投票
   发表时间:2011-07-11  

正常交易中 -> B遇到异常后,对A系统的数据进行冲正(增加相应接口) -> 定期A,B系统之间对账
0 请登录后投票
   发表时间:2011-07-11   最后修改:2011-07-11
想了想,不知道为什么B系统要把A系统的操作也放入B系统的事务里边,我任务一个独立的系统,应该保持自己的独立性,完整性,
B系统的交易异常,可以通过其他方式去修改A系统中的数据,这个应该是两次交易(一次是正常交易,一次是数据冲正交易),A系统有责任把当前这两次操作信息全部记录,如果在B系统事务控制,是否有欠妥当?
0 请登录后投票
   发表时间:2011-07-11  
可以考虑使用tcp通讯中间件代替http接口请求,那样不会出现你所说的情况,因为每个请求有没有收到都会有回执。
0 请登录后投票
   发表时间:2011-07-11  
应该和Inter网里面的 TCP/IP协议的确认过程3次握手类似。
0 请登录后投票
   发表时间:2011-07-11  
此贴可以鉴定现在je的水平,大部分人没看明白楼主到底要描述的东西就瞎回答.
金融相关,简单来搞,钱不是一次扣的,先冻结最后再划拨,流水日志很非常非常重要的,日终对账全靠它了.当然,select for update也是逃不了的.
0 请登录后投票
   发表时间:2011-07-11  
B出现异常了,给A发回滚消息就是了.
0 请登录后投票
   发表时间:2011-07-11  
taolei0628 写道
287854442 写道
bobotc 写道
确切的说银行项目是没有使用到事务的。。


不使用事务,那使用什么来保证安全性和可靠性呢?


确切地说,应该是不用分布式事务(如XA事务),尤其是局域网络之外的分布式事务。

本质上来说,数据库的事务交易和金融交易完全不是一回事儿,是不同层面、不同领域的概念,只不过从技术实现角度上它们存在着一些必要的、习惯性的联系,所以容易在某些地方容易被混淆。我曾经在对一篇关于“Base 一种Acid的替代方案”的评论当中提到过,并非原作者的本意,但实际传播和读者理解过程中存在着把金融交易(商业交易)和数据库事务交易混淆的问题(尤其是所谓‘最终一致性'的概念),可惜并没有人认同,大概是做金融业务的人关心技术实现的不多,同时做技术研发实现的人关心金融业务的也同样不多吧。

两个金融系统转账应该已经不能划归成一个事务,或者不能认为是db层面的一个事务
肯定也不可能严格遵循acid,比如工行a用户向招行a用户自转钱,在处理过程结束之前,两者金额总和肯定不会包含该笔转账资金,这笔钱只存在于处理队列当中。
要实现补偿肯定就需要对处理实行操作日志化操作对象枷锁,并实现对于日志的redo和undo逻辑,这个并不难
比较麻烦的部分是在分布式系统有时你是没法对一些remote资源加锁,因此即使有这么套逻辑也没用,如果要做到对修改资源没有锁保护的补偿,就必须在访问者上面下手,做很多严格限制才有可能做到
对于基于db的分布式事务实际用两段提交也是无法严格意义上实现绝对可靠,因为实际是db掌握锁,而对db的放锁通知始终会存在串行效应
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics