A系统是演唱会订票系统,B系统是付款系统,负责处理A系统和银行之间的,收钱。退钱的操作。
B系统式多线程的。也就是A系统请求付钱。B系统在验证合法性后,一方面起线程调用银行的API,等返回结果后又起一线程来发通知给A系统(A系统的servlet)做一些更新数据库的操作。
A系统有自己的业务tranxAppID,B系统有tranxID与tranxAppID。
在退票页面。有个确认页面。当你同时打开两个窗体同时点到确认页面后,断点设在B系统调API之前,uA先点,后uB再点,uB会报错,因为uA已经把A和B系统的那个tranx标志为退款的了,那么uB的那个操作就会退回到A中,并且把A数据库中的tranx标志设为null,后来你再让uA执行,那么银行扣钱是成功了。当发通知给A系统时,银行A系统的按个tranx被设为null了。。所以A系统就返回错误给B,那么B认为A没操作成功,就不停的发通知(达到一定数停止),
还有就是以个tranx定2个演唱会的票,那么在退某个票的时候,执行上面的操作就会一张票扣两次钱,下次你再扣另外一张就没钱扣了。。这是很严重的问题,
关键就是在如何避免uA uB两个页面同时操作的问题, 问题的解决方案就是versuonNum的简单解决方案,在页面隐藏version值,在点YES按钮 按照version更新表中的值,如果成功证明没人动过这个记录。否则有人已经先动了。就不会调B系统。这样问题就解决了。
饶了一大圈。。还是回归到了最简单的解决方案。。。哎。。
B系统式多线程的。也就是A系统请求付钱。B系统在验证合法性后,一方面起线程调用银行的API,等返回结果后又起一线程来发通知给A系统(A系统的servlet)做一些更新数据库的操作。
A系统有自己的业务tranxAppID,B系统有tranxID与tranxAppID。
在退票页面。有个确认页面。当你同时打开两个窗体同时点到确认页面后,断点设在B系统调API之前,uA先点,后uB再点,uB会报错,因为uA已经把A和B系统的那个tranx标志为退款的了,那么uB的那个操作就会退回到A中,并且把A数据库中的tranx标志设为null,后来你再让uA执行,那么银行扣钱是成功了。当发通知给A系统时,银行A系统的按个tranx被设为null了。。所以A系统就返回错误给B,那么B认为A没操作成功,就不停的发通知(达到一定数停止),
还有就是以个tranx定2个演唱会的票,那么在退某个票的时候,执行上面的操作就会一张票扣两次钱,下次你再扣另外一张就没钱扣了。。这是很严重的问题,
关键就是在如何避免uA uB两个页面同时操作的问题, 问题的解决方案就是versuonNum的简单解决方案,在页面隐藏version值,在点YES按钮 按照version更新表中的值,如果成功证明没人动过这个记录。否则有人已经先动了。就不会调B系统。这样问题就解决了。
饶了一大圈。。还是回归到了最简单的解决方案。。。哎。。