事务的边界问题:出现的问题在于在这个事务中我更新了某条数据需要告知其他系统来操作数据(这个数据可能包括外部系统自身的也可能是反过来操作我自身系统的数据),但是会出现两种BUG,第一,由于在本系统中事务没有结束,数据未更新到数据库,导致其他系统读取数据失败或者脏读;第二,由于本系统事务是个长事务,在后面操作异常回滚,但是其他系统却已经操作完毕导致的BUG。
因此在一个长事务的过程中,如果涉及到与外部系统交互的数据,最好使用如下方法,避免数据库本身的隔离界别导致的数据的脏读。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//需要与外界系统交互的数据问题处理
}
});