项目: 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 valuespring正常介入事务,问题解决。