• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路)

java 搞代码 4年前 (2022-01-09) 19次浏览 已收录 0个评论
文章目录[隐藏]

1 前言

领域服务

createUserError1调用private方法

createUserPrivate,被@Transactional注解。当传入的用户名包含test则抛异常,让用户的创建操作失败

getUserCount

用户接口层

调用UserService#createUserError1

测试结果
即便用户名不合法,用户也能创建成功。刷新浏览器,多次发现有十几个的非法用户注册。 @Transactional生效原则 public方法

除非特殊配置(比如使用AspectJ静态织入实现AOP),@Transactional必须定义在public方法才生效。

因为Spring的AOP,private方法无法被代理到,自然也无法动态增强事务处理逻辑。

那简单,把createUserPrivate方法改为public不就行了。
但发本文来源gao@!dai!ma.com搞$$代^@码!网!现事务依旧未生效

必须通过代理过的类从外部调用目标方法

要调用增强过的方法必然是调用代理后的对象。
尝试修改UserService,注入一个self,然后再通过self实例调用标记有 @Transactional 注解的createUserPublic方法。设置断点可以看到,self是由Spring通过CGLIB方式增强过的类:

this/self/Controller调用UserDomainService

  • this自调用

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址