首页IT科技@transactional注解参数(【踩坑记录】@Transactional注解回滚不生效问题)

@transactional注解参数(【踩坑记录】@Transactional注解回滚不生效问题)

时间2025-09-19 09:04:55分类IT科技浏览6213
导读:@Transactional属于是Spring的常用事务处理注解了,最近在开发时偶然发现这个东西竟然不是100%生效的。...

@Transactional属于是Spring的常用事务处理注解了                ,最近在开发时偶然发现这个东西竟然不是100%生效的                 。

问题重现:

测试一个批处理方法                         ,方法上加了@Transactional后执行        ,因为加了事务处理注解                ,没怎么关注SQL执行顺序(反正对事务来说都是原子性的)                         ,debug过程发现MongoDB连接有问题        ,有关Mongo的操作抛出了异常        ,因为数据库的某个字段是批处理的触发条件                         ,并且在批处理过程中会更新这个字段                        。重新执行发现数据库(Postgresql)的数据被update了                 ,没有触发        。嗯        ,确实之前没关注这个注解会有不生效的问题                        ,开始处理:

首先为了方便测试批处理任务(定时调度的)                 ,我在debug阶段直接用了@PostConstruct注解,即项目启动后直接运行批处理任务                        ,像下面这个样子:

后来验证问题就出在这个@PostConstruct上         。

问题处理:

遇到问题最直接的办法                         ,Google一下,确实涨知识了                ,以下情况@Transaction注解不会生效:

被注解标记的方法不是public的 只有同类中方法调用 数据库本身不支持事务 propagation或rollbackFor设置错误                         ,这种情况一般都会注意

问题分析:

我们使用的@PostConstruct就是第二种情况不生效导致的        ,@PostConstruct是Java EE提供的注解                ,不属于Spring                         ,而@Transactional注解的生效实际是由Spring AOP控制的        ,生成一个代理类        ,执行事务开启和提交的逻辑                         ,不过                 ,只有当该类以外使用被@Transactional修饰的方法时        ,这个代理类才会生成                        。所以                        ,如果不是debug使用了@PostConstruct                 ,本来其实是没问题的                。

声明:本站所有文章,如无特殊说明或标注                        ,均为本站原创发布         。任何个人或组织                         ,在未征得本站同意时,禁止复制                 、盗用                        、采集        、发布本站内容到任何网站         、书籍等各类媒体平台                         。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理                。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
vuepress2 文件加密(解决VuePress中的”Error from chokidar : Error: EBUSY“问题) win11怎么结束进程(win11后台运行的应用怎么关闭? win11禁止应用后台运行的技巧)