TransactionalEventListener

记录下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都是立即执行;

你可能感兴趣的:(事件,Spring事件机制)