BaseMapper的insert方法快速插入数据未提交问题

17 篇文章 1 订阅

一、前言

今天测试一批日志数据插入数据库,发现通过BaseMapper的int insert(T entity);方法在大量数据进行插入的时候插入的数据变成了未提交。意思就是程序运行insert成功,但是数据库里却没有数据。当一条一条数据插入的时候却是可以的,循环快速插入却不生效。不知道为何。

二、BaseMapper insert方法

public interface BaseMapper<T> extends Mapper<T> {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);
}

调用insert方法

@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class BlockchainLogService {
	@Autowired
	private BlockchainLogMapper blockchainLogMapper;
	
	public void blockchainLog(BlockchainLog blockchainLog) {
	
	 
		try {
			blockchainLogMapper.insert(blockchainLog);
			
		} catch (Exception e) {
			log.info("保存日志异常:"+e.getMessage());
		}
		 
	}

}

这种方式发现当循环插入日志时,事务并没有提交。

我的解决办法:手动添加commit语句

@Repository
public interface BlockchainLogMapper  extends BaseMapper<BlockchainLog>{
	
	/**
	 * 查询商户
	 */
	@Select("<script>"
			+ "commit "
			+ "</script>")
	public  void commit();


}

在插入日志后,调用commit()方法,通过这个方式就解决了。

@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class BlockchainLogService {
	@Autowired
	private BlockchainLogMapper blockchainLogMapper;
	
	public void blockchainLog(BlockchainLog blockchainLog) {
	
		 
		try {
			blockchainLogMapper.insert(blockchainLog);
			blockchainLogMapper.commit();
			
		} catch (Exception e) {
			log.info("保存日志异常:"+e.getMessage());
		}
	 
		 
	}

 

 

三、MySQL事务隔离级别

MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种:

  1. READ UNCOMMITTED:读未提交。
  2. READ COMMITTED:读已提交。
  3. REPEATABLE READ:可重复读。
  4. SERIALIZABLE:序列化。

1.四种事务隔离级别

 

1.1 READ UNCOMMITTED

读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。

1.2 READ COMMITTED

读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。

1.3 REPEATABLE READ

可重复读,MySQL 默认的事务隔离级别。可重复读可以解决“不可重复读”的问题,但还存在幻读的问题。所谓的幻读指的是,在同一事务的不同时间使用相同 SQL 查询时,会产生不同的结果。例如,一个 SELECT 被执行了两次,但是第二次返回了第一次没有返回的一行,那么这一行就是一个“幻像”行。

注意:幻读和不可重复读的侧重点是不同的,不可重复读侧重于数据修改,两次读取到的同一行数据不一样;而幻读侧重于添加或删除,两次查询返回的数据行数不同。

1.4 SERIALIZABLE

序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋力向前123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值