MyBatis 缓存与 Spring 事务相关笔记
一、MyBatis 缓存
- 缓存作用:减少对数据库的访问,提高查询效率。当进行两次相同的查询时,可直接使用缓存数据。
- 一级缓存
- 默认开启
- 级别:SQLSession 级别
- 特点:必须是同一个 SQLSession 才会使用到缓存
- 二级缓存
- 需要手动开启,使用
<cache>
标签启用 - 级别:Mapper 级别
- 特点:使用同一个 Mapper 查询同一个 SQL 且参数相同时,会击中缓存;二级缓存的数据需要可序列化
- 需要手动开启,使用
二、Spring 事务实现方式
编程式事务
- 通过
TransactionTemplate
实现 - 示例代码:
@Autowired TransactionTemplate tt;@RequestMapping("testa") public void testTransaction(){tt.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {try{// 业务操作// ...} catch (Exception e) {status.setRollbackOnly(); // 发生异常时回滚}}}); }
- 通过
声明式事务
- 通过
@Transactional
注解实现 - 示例代码:
@RequestMapping("testb") @Transactional(rollbackFor = Exception.class,isolation = Isolation.DEFAULT) public void testTransactionB(){// 业务操作// ... }
- 通过
三、事务隔离级别
Isolation.DEFAULT
:默认,跟随连接的数据库的隔离级别- 其他级别:读未提交、读已提交、可重复读、串行化
四、事务失效的情况
- 事务传播行为设置有问题(如
never
、not_supported
,以非事务方式运行) - 数据库不支持事务(如使用 MyISAM 存储引擎的表)
- 方法的访问权限修饰符影响动态代理重写 / 调用此方法
- 在类的内部调用自身的方法(
this
调用,非动态代理对象)
五、Spring 事务传播行为(7 种)
Propagation.REQUIRED
(默认)- 若外部有事务,就加入事务;若外部没有事务,创建新事务独立运行
Propagation.SUPPORTS
(拥护)- 若已有事务,加入事务;若没有事务,以非事务处理
Propagation.MANDATORY
(强制的)- 若有事务,加入;若没有,抛出异常
Propagation.REQUIRES_NEW
(必须独立)- 若有事务,挂起当前事务,创建新事务;若没有,创建事务
Propagation.NOT_SUPPORTED
(不拥护)- 若有事务,挂起,当前方法以非事务方式运行;若没有,以非事务方式运行
Propagation.NEVER
(不能有事务)- 若有事务,抛出异常;若没有,以非事务方式运行
Propagation.NESTED
(嵌套)- 若有事务,嵌套事务运行;若没有,创建新事务