Mybatis Plus插入数据事务控制常见异常、报错问题,No value for key,Transaction is already completed,ResultSet is from UP

场景:
在手动控制事务中,使用全局事务管理器对象,正常插入数据、或批量、或使用线程池开启多线程批量插入数据,都有可能出现以下错误

错误一:

No value for key [xxx] bound to thread

解决:
1、由于手动控制事务释放资源时,需要开启一个统一管理的全局事务
2、此错误是声明式事务和手动控制事务相冲突,如果在代码中有涉及到手动控制注入数据源事务管理Bean对象 DataSourceTransactionManager,如果出现上述问题,请开启声明事务:@Transactional(rollbackFor = {Exception.class})
3、如果方法内部调用的保存或删除方法也走Spring事务管理、或者内部方法开启的有新的事务,那么内部方法也要开启声明式事务:@Transactional(rollbackFor = {Exception.class})

错误二:

ResultSet is from UPDATE. No Data

解决:
1、首先检查SQL语法是否正确,保证SQL语句没问题
2、有可能是同一时间进入了多条SQL语句,再释放结果集对象的时候冲突,需要考虑线程安全问题,在需要同步的代码对象加上synchronized 同步锁关键字,例如:

        sysUserAddressList.forEach(obj -> {
            synchronized (obj) {
                save(obj);
            }
        });


3、若是在JDBC工具类中将Connection,PreparedStatement或ResultSet定义成全局静态变量,则要考虑线程安全问题

错误三:

Transaction is already completed - do not call commit or rollback more than once per transaction

 解决:
1、手动控制事务,提示很明显,已完成的事务,不要多次提交或回滚
2、在提交或回滚事务之前,先判断该事务状态是否完成即可:

                transactionStatuses.forEach(status -> {
                    if (!status.isCompleted()) {
                        dataSourceTransactionManager.commit(status);
                    }
                });

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,报错信息显示缺少'sqlSessionFactory'或'sqlSessionTemplate'属性。这通常是因为Mybatis Plus无法自动注入SqlSessionFactory或SqlSessionTemplate实例。解决此问题的方法是手动注入SqlSessionFactory或SqlSessionTemplate实例。以下是使用Mybatis Plus动态数据源和Sharding 5.1.0的示例代码: ```java @Configuration @MapperScan(basePackages = "com.example.mapper") public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } @Bean public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(2); dataSourceMap.put("master", masterDataSource()); dataSourceMap.put("slave", slaveDataSource()); dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); dynamicDataSource.setTargetDataSources(dataSourceMap); return dynamicDataSource; } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dynamicDataSource()); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate() throws Exception { return new SqlSessionTemplate(sqlSessionFactory()); } @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } @Bean public ShardingDataSource shardingDataSource() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration()); shardingRuleConfig.getBindingTableGroups().add("t_order"); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new ModuloShardingDatabaseAlgorithm())); shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new ModuloShardingTableAlgorithm())); Properties properties = new Properties(); properties.setProperty("sql.show", "true"); return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, properties); } private TableRuleConfiguration getOrderTableRuleConfiguration() { TableRuleConfiguration result = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..1}"); result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new ModuloShardingDatabaseAlgorithm())); result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new ModuloShardingTableAlgorithm())); return result; } private Map<String, DataSource> createDataSourceMap() { Map<String, DataSource> result = new HashMap<>(2); result.put("ds0", masterDataSource()); result.put("ds1", slaveDataSource()); return result; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值