• 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拦截,创建具有事务功能的代理对象

  • 相关阅读:
    30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
    SAP Marketing Cloud功能简述(一) : Contacts和Profiles
    如何使用点击超链接的方式打开Android手机上的应用
    1036. Boys vs Girls (25)
    Yet another A + B
    1033. To Fill or Not to Fill (25)
    1032. Sharing (25)
    1021. Deepest Root (25)
    1017. Queueing at Bank (25)
    1016. Phone Bills (25)
  • 原文地址:https://www.cnblogs.com/sunxun/p/11309451.html
Copyright © 2020-2023  润新知