问题出现情况:
声明式事物@Transactional
在一个service调用了两个不同mapper 先后update两个数据,人为模拟后一个mapper异常,发现第一个mapper会提交数据。
网上有两种解决方法 第一个 方法 ,在@Transactional 调整事物传播方式从默认requared改为NESTED,并加入rollbackFor=Exception.class,修改后,无效。检查日志,发现当第一个mapper在执行完update时会按如下顺序执行:
DEBUG - Creating a new SqlSession
DEBUG - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d0d75] was not registered for synchronization because synchronization is not active
DEBUG - Fetching JDBC Connection from DataSource
DEBUG - JDBC Connection [jdbc:oracle:thin:@192.168.7.10:1521:VD, UserName=JOKER, Oracle JDBC driver] will not be managed by Spring
DEBUG - ooo Using Connection [jdbc:oracle:thin:@192.168.7.10:1521:VD, UserName=JOKER, Oracle JDBC driver]
DEBUG - ==> Preparing: update ss_user s_user set s_user.certsn=?,s_user.de