两个数据库其间的事务操作是否是这样的
两个数据库之间的事务操作是否是这样的A行有a帐号要汇¥100到B行b帐号中。(A,B行为不同数据库)A,B行之间提供
两个数据库之间的事务操作是否是这样的
A行有a帐号要汇¥100到B行b帐号中。(A,B行为不同数据库)
A,B行之间提供一个报文收发的接口专门用于处理事务,格式
事务请求报文:
事务号:要操作的命令(比如给b帐号+¥100)
事务回应报文:
事务号:是否成功完成事务中本方要完成的工作(true or false)
我们暂且把这一事务号定为T100,而这过程中A行自己要做的事被称为T100A事务(B行一样)
1. (A行)prepared commit T100A2. (A行)a帐号-¥1003. (A行)记录跨行交易日志T100A4. (A行-->B行)报文(T100:给b帐号+¥100)5. (B行)prepared commit T100B6. (B行)b帐号+¥1007. (B行)记录跨行交易日志T100B8. (B行)commit T100B9. (B行-->A行)报文(T100:true)10. (A行)只有当接收到(T100:false)的报文时才进行回滚事务T100A11. (A行)commit T100A12. (A行)查看B行的跨行交易日志与A行对应的日志做比较,判断交易是否成功,以B行为准,如果B行的操作失败则给a帐号+¥100
本文主要参考http://www.iteye.com/topic/78417自己胡乱构想
不知道这样的操作步骤对不对,这只是我个人的想法,希望大家给点建议1.(A行)prepared commit T100A2.(A行)a帐号-¥1003.(A行)记录跨行交易日志T100A4.(A行-->B行)报文(T100:给b帐号+¥100)5.(A行)commit T100A6.(B行)prepared commit T100B7.(B行)b帐号+¥1008.(B行)记录跨行交易日志T100B9.(B行-->A行)报文(T100:true)10.(B行)commit T100B11.(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又给自己加钱,在这个时间段内不是两边都多了钱?钱少好可以给他加,钱多被人取了怎么办?