场景:
Result result = mapper.select();
mapper.insert();
Result result1 = mapper.select();
问题:
会出现result和result1俩个是同一个值。
result从DB查询, result1直接从缓存中获取,但是insert执行了insert,result没有获取到。
问题延伸:
在一个场景中,对一个数据进行反复的插入,查询使得数据没有同步,mybatis中的缓存没有更新。
解决方案:
一、对insert的数据进行java内存保存,然后在后面的查询中及时补充。
类似于
List<Result> result = mapper.select();
Result data = new Result()
mapper.insert(data);
List<Result> result1 = mapper.select();
result1.add(data);
这个是在解决不破坏事务的基础上
二、直接开启Spring的事务隔离机制
隔离级别:
1) DEFAULT (默认)
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。
2) READ_UNCOMMITTED (读未提交)
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
3) READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
4) REPEATABLE_READ (可重复读)
这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。
5) SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。
总结:
这个问题主要是针对于Spring的事务机制,可以深入了解Spring的事务传播属性和隔离级别