java业务需求系统调用消息通知怎么写(java写业务)
导语:Java,业务需求,系统调用,消息通知,事务可见性实战问题
业务场景:业务系统A,通过调用业务系统B,完成某项业务,过程为:系统A中有一个WEB请求,执行调用2次系统B,系统B成功之后,返回消息通知,通知最少2次。
下图为时序:
通知情况:
业务的事务问题系统A中有一个WEB请求,执行某个方法(业务处理,第1个线程),第1次调用完成,第2次还未完成,这时系统A已经收到了系统B的第1次通知(业务处理,第2个线程),第2次调用完成后,系统A又收到了B系统的第2次通知(业务处理,第3个线程),这时保存业务数据,调用结束。
根据描述:数据库事务级别为可重复读,由于是同一个业务,第1个线程、第2个线程、第3个线程,都开启了事务且操作的数据库表中的同一条记录,因此,事务存在并发问题。
隔离级别为可重复读的事务顺序当数据库为可重复读的隔离级别时,事务A先创建视图,视图编号99,事务B获取视图100,事务C获取视图101。
如果执行顺序:1:事务C、2:事务B、3:事务A。那么,事务C执行之后,当前视图的编号更新成了102,事务B执行之后,当前视图编号更新成了103,事务A只有读操作,当前视图编号不变还是99。
事务可见性的规则如下:
1、版本未提交,不可见,事务A不可读事务B。
2、版本已提交,但是视图的版本号比当前事务高,不可见。
3、版本已提交,且视图的版本号比当前事务低,可见。
业务场景的解决方案:同一个业务,第1个线程、第2个线程、第3个线程都开启了事务:
1、这3个事务的先后顺序并不能严格地保证,因此,数据可能出现错乱而无法按要求完成业务
2、解决方案,使用锁、分布式锁,锁定【业务ID】,来保证线程的执行顺序,先得到锁的先执行,使的执行顺序变为:第1个线程 --> 第2个线程 --> 第3个线程。
3、经过上述处理后,第2个线程、第3个线程的业务处理,依然有数据错乱问题,也就是说依然不能保证第2个线程和第3个线程的事务顺序。
4、解决方案,第2个线程和第3个线程的业务处理,采用不同的时间间隔来延时处理,最后问题全部解决。
本文内容由小荣整理编辑!