日期:2014-05-16  浏览次数:20401 次

两个数据库之间的事务操作是否是这样的
A行有a帐号要汇¥100到B行b帐号中。(A,B行为不同数据库)

A,B行之间提供一个报文收发的接口专门用于处理事务,格式

  事务请求报文:

     事务号:要操作的命令(比如给b帐号+¥100)

  事务回应报文:

     事务号:是否成功完成事务中本方要完成的工作(true or false)

我们暂且把这一事务号定为T100,而这过程中A行自己要做的事被称为T100A事务(B行一样)

1. (A行)prepared commit T100A

2. (A行)a帐号-¥100

3. (A行)记录跨行交易日志T100A

4. (A行-->B行)报文(T100:给b帐号+¥100)

5. (B行)prepared commit T100B

6. (B行)b帐号+¥100

7. (B行)记录跨行交易日志T100B

8. (B行)commit T100B

9. (B行-->A行)报文(T100:true)

10. (A行)只有当接收到(T100:false)的报文时才进行回滚事务T100A

11. (A行)commit T100A

12. (A行)查看B行的跨行交易日志与A行对应的日志做比较,判断交易是否成功,以B行为准,如果B行的操作失败则给a帐号+¥100



本文主要参考http://www.iteye.com/topic/78417自己胡乱构想
不知道这样的操作步骤对不对,这只是我个人的想法,希望大家给点建议
1 楼 xijinn 2008-10-16  
kingo 写道
如果B行commit后进行A行的提交失败了你怎么办?有办法回滚么?

确实,我没想到这点
我分析了一下a有两种情况可以拿到退回的款
一种是当B行操作直接返回失败的时候,另一种是在对账的时候可以给a补回(也就是B行操作不成功,但是A行没有接受到操作失败的信号时)
其他情况都应该是给a帐号扣钱的
所以我这里A行的操作就不应该是一个事务,因为如果是一个事务就无法满足B行操作成功而A行自己操作失败而造成的回滚
看来应该先给a帐号-¥100,只有在(B行-->A行)报文(T100:false) 的情况以编程的方式给a帐号+¥100元
不知道这样的方式会不会还有别的问题
我听说过ebay好像都是以编程式事务做的
2 楼 xijinn 2008-10-16  
我重新整理了一下, 另外我把B行向A行发完成报文的事放到了B行给b帐号+¥100的事务里面了
1.	(A行)prepared commit T100A
2.	(A行)a帐号-¥100
3.	(A行)记录跨行交易日志T100A
4.	(A行-->B行)报文(T100:给b帐号+¥100)
5.	(A行)commit T100A
6.	(B行)prepared commit T100B
7.	(B行)b帐号+¥100
8.	(B行)记录跨行交易日志T100B
9.	(B行-->A行)报文(T100:true)
10.	(B行)commit T100B
11.	(A行)当接收到(T100:false)的报文时操作a帐号+¥100(也就是这一步是编程式回滚,不能通过数据库的事务来实现)
12.	(A行)查看B行的跨行交易日志与A行对应的日志做比较,判断交易是否成功,
以B行为准,如果日志上发现B行的操作失败或者没有这个事务号则给a帐号+¥100

大家有想法给我指点一下,谢谢了
3 楼 kop 2008-10-17  
两个不同的数据库之间,要用到JTA事务或则是容器事务

也就一定不要使用JDBC事务的commit或rollback了。
4 楼 fight_bird 2008-10-17  
应该有成熟的跨数据库平台的JTA开源实现项目,底层的这类实现实无必要自己做。
5 楼 tinywind 2008-10-17  
据我所知,目前的银行系统跨行交易是没有事务保证的
6 楼 xijinn 2008-10-17  
谁有例子,能给见识一下吗?不一定非得银行的
只要能实现跨数据库的事务
我以前听老师说过好像有种方式是数据库镜像什么的,然后当本地数据库来操作
7 楼 weaveph 2008-10-17  
A发起交易报文给B
A给自己扣钱
A提交

B收到报文
B给自己加钱
B提交
B发送应答报文给A

A收到应答报文
交易不成功则A给自己加钱
A发送冲正报文给B

B收到冲正报文
B给自己扣钱

我们这边基本是这样做异地交易
8 楼 xijinn 2008-10-17  
weaveph 写道
A发起交易报文给B
A给自己扣钱
A提交

B收到报文
B给自己加钱
B提交
B发送应答报文给A

A收到应答报文
交易不成功则A给自己加钱
A发送冲正报文给B

B收到冲正报文
B给自己扣钱

我们这边基本是这样做异地交易

这里有几个疑问
是不是只有在A收到应答报文的情况才算交易成功?
假如B确实加钱了,也给发送报文,可惜报文丢了。
那A又给自己加钱,在这个时间段内不是两边都多了钱?钱少好可以给他加,钱多被人取了怎么办?