spring + shiro 配置中部分事务失效分析及解决方案

项目: springboot+mybatis+mysql+shiro

问题:有关用户与权限的服务无法实现事务,但其他服务均正常。


故意触发异常,大概的日志如下

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a90acfa] was not registered for synchronization because synchronization is not active
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6add54e7] will not be managed by Spring
==>  Preparing: insert into t_user_ts_info(id) values(?) 
....
java.sql.SQLException: Field 'RANDOM_NUM' doesn't have a default value

该连接并没有交由spring管理,自然@Transactional无法管理事务。

由于其他服务事务均可正常使用,排除数据源配置问题,问题推测是bean容器相关的问题导致。


Bean创建日志:


创建的顺序有问题,ProxyTransactionManagementConfiguration还没有配置事务管理之前,服务就已经被创建了,无法应用到事务。

既然是创建(初始化)的问题,那就将服务延后在事务配置之后即可。

public class UserRealm extends AuthorizingRealm {
    @Autowired
    @Lazy
    private PermissionService permissionService;

    @Autowired
    @Lazy
    private UserOptService userOptService;

...//后面正常配置

加上@Lazy,调用时再创建。


不会getUserRealm时立即创建服务,事务配置后再初始化。


Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2040341a]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2040341a] from current transaction
==>  Preparing: insert into t_user_ts_info(id) values(?) 
.....
java.sql.SQLException: Field 'RANDOM_NUM' doesn't have a default value
spring正常介入事务,问题解决。


猜你喜欢

转载自blog.csdn.net/keliii/article/details/80051688
今日推荐