独立activerecord中 spring事务不生效

@JFinal

我在使用 springboot整合activerecord时,发现spring的事务并不起作用,查了下 activerecord 包的源码发现 Model save 或 update 方法执行完成后会调用config.close(pst, conn); 关闭连接,再看Config 里close 方法有个判断:

if (threadLocal.get() == null) { // in transaction if conn in threadlocal

if (conn != null) {try {conn.close();}

catch (SQLException e) {throw new ActiveRecordException(e);}}

}

而我使用spring 注解的事务@Transactional 后这个 threadLocal.get() 一直都是空值,所以出现spring的事务失效,而出现脏数据,如:

@Transactional

public void save(){

try{

User user1 = new User();

user1 .set("id",1);

user1 .set("name","JFinal1");

user1.save();

User user2 = new User();

user2 .set("id",1);

user2 .set("name","JFinal111111111111111111111111111111111111111111111111111111111");

user2.save();

}

catch (Exception e) {

            log.error("数据库操作失败",e);

            throw new BizLayerException("数据库操作失败");

        }

}

当第二个保存因字段长度不够报错后抛出异常,但第一个还是提交数据库了,请问有什么解决方案,确保spring的事务有效,谢谢!


评论区

xunmeng

2020-09-09 15:40

@JFinal 或者说是否可以在ActiveRecordPlugin 启动时加个方法让spring完全托管事务呢

小李子a

2020-09-09 16:45

http://jfinal.com/share/1867

小李子a

2020-09-09 16:45

基于springboot的,你可以参考一下

xunmeng

2020-09-09 16:50

@小李子a 好的,我学习下,谢谢

xunmeng

2020-09-09 16:53

@小李子a http://jfinal.com/share/1867 这上面讲的我看,我用的就是这种方式,还是不生效的,如下是我的代码
@Slf4j
@EnableTransactionManagement
@Configuration
public class DruidDataSourceConfig {

@Bean(name = "dataSourceDb1")
@Primary
@ConfigurationProperties("spring.datasource.druid.one")
public DataSource dataSourceDb1() {
DruidDataSource druidDataSource = new DruidDataSourceWrapper();
log.info("druidDataSource.dataSourceDb1 loaded......");
return druidDataSource;
}

@Bean(name = "dataSourceProxy")
public TransactionAwareDataSourceProxy dataSourceProxy() {
log.info("TransactionAwareDataSourceProxy loaded......");
return new TransactionAwareDataSourceProxy(dataSourceDb1());
}

@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager() {
log.info("PlatformTransactionManager loaded......");
return new DataSourceTransactionManager(dataSourceProxy());
}

}
-----------------------------------------------------------------------------------
ActiveRecordPlugin arp = new ActiveRecordPlugin(dataSourceProxy);
boolean showSqlb = "true".equals(showSql) ? true : false;
arp.setShowSql(showSqlb);
addMappings(arp);
arp.start();

小李子a

2020-09-09 17:14

@xunmeng 你看一下是不是DataSourceTransactionManager的问题,我一直在用这个方式,没有出现过问题

xunmeng

2020-09-09 17:35

小李子a DataSourceTransactionManager 这个问题怎么看,这样的用法我以前用jfinal 整合spring的时候也是没问题的,就是现在spingboot 整个独立ActiveRecord 包的时候碰到的问题

热门反馈

扫码入社