记录下spring的事件机制使用过程中的问题;以下为了方便A方法中执行数据库操作,并发送事件;事件接收处理器为B方法;EventListener注解添加在B方法上;
1.@EventListener
正常情况,B和A为同一个事务,B中读取到的为A中未提交的事务数据;B中抛出异常,会导致A中的事务回滚;
2.@EventListener+Async
A和B是两个事务,之间不会有任何关联;B中方法会立刻执行,所以拿到的数据看当时的数据库数据;
3.@TransactionalEventListener
默认的阶段是TransactionPhase.AFTER_COMMIT
会在A方法执行完成之后,再执行B方法;因为是commit之后,所以B中抛出异常,A中不会回滚;
读取到的也是A中事务的数据,是一个事务;
4.@TransactionalEventListener,phase = TransactionPhase.BEFORE_COMMIT
提交之前,所以抛出异常会影响A中事务的提交,但是读取的数据,是A中的数据是一样的;
5.Async+@TransactionalEventListener
不区分哪个阶段,但是是同一个事务中的数据;而且抛出异常也不会影响A中事务的回滚;
注:TransactionalEventListener的情况下不管有没有async,如果A中发生异常,B是不会执行的;可以理解为回调机制,只有A中执行成功了,B才可以开始执行;而且B不会立即执行,都是A执行之后才开始;这跟EventListener不同;EventListener的情况下加不加Async,B都是立即执行;