背景
需求是记录下操作过数据库的行为,将其记录到一个操作行为表中,我选择了使用aop特性来实现这一功能,发现当操作行为一切正常时,这个mybatis的save方法正常执行,行为表里正常增加记录。但是当操作行为抛出异常时,这个save方法也正常返回true,但是行为表里就是没有新增记录。(这篇博文遇到的是跟我这个类似的情景,但是它的catch不需要继续抛捕获到的异常。)
解决
经过gpt提醒,先打印了sql日志(springboot项目开启sql日志),发现sqlSession在关闭前并没有commit,说明事务发生了回滚,查阅资料得知,异常会导致回滚,因为我使用@Around包裹的操作行为,操作行为抛出的异常被切面catch了以后,还是要继续抛出去(因为有一个专门的ExceptionHandler来处理这些异常),所以在catch里抛异常会回滚事务,save也被回滚掉了。
我问gpt解决方法,它让在finally里进行save,但是这个save语句要被包裹在一个try-catch里,我不知道为什么要这样做,但是确实有效,还望大佬们答疑解惑。(这篇博文点了一下可能的原因,但是我还是没看懂)