zoukankan      html  css  js  c++  java
  • Spring-boot +Shiro 导致事务无效

    今天在开发过程中,遇到一个情况,就是事务事务,同项目的别的service都在事务中,可以就是有一个事务失效.

    排除了各种情况

    1.检查数据库的引擎是否是innoDB

    2.方法是否为public

    3.这里引用的是spring-tx.xml配置的事务管理

    除去以上的情况,发现还是不行,就完全有点摸不着头脑了.

    经过一番调查后,发现是和Shiro结合导致的问题.

    查了下解释:

    由于ShiroFilterFactoryBean实现了FactoryBean接口,所以它会提前被初始化。又因为SecurityManager,SecurityManager依赖于Realm实现类、Realm实现类又依赖于UserService,所以引发所有相关的bean提前初始化。

    ShiroFilterFactoryBean -> SecurityManager -> Realm实现类 -> UserService

    但是此时还只是ApplicationContext中registerBeanPostProcessors注册BeanPostProcessor处理器的阶段,此时AnnotationAwareAspectJAutoProxyCreator还没有注册到BeanFactory中,UserService无法享受到事务处理!

    个人理解大概就是,因为在Realm 中使用了该service,相当于实例化了一次,由于是单例模式,后面都是沿用这个引用.由于初始化的对象都还没有能够被事务管理,所以导致此问题.

    解决办法:

    在Realm实现中使用Mapper,而不是直接使用Service对象。缺点:直接和数据库交互,并且也没有Service中的逻辑交互以及缓存
    在Realm中Service声明上加入@Lazy注解,延迟Realm实现中Service对象的初始化时间,这样就可以保证Service实际初始化的时候会被BeanPostProcessor拦截,创建具有事务功能的代理对象

  • 相关阅读:
    Java正则表达式, 提取双引号中间的部分
    如何快速找到未知长度单链表的中心点的值
    西格玛
    对数
    jquery显示隐藏toggle
    JavaScript:改变li前缀图片和样式
    jquery点击改变图片src源码并toggle
    jquery点击改变class并toggle
    linux下合并两个文件夹
    编译安装httpd
  • 原文地址:https://www.cnblogs.com/sunxun/p/11309451.html
Copyright © 2011-2022 走看看