SSM-Spring-数据库事务管理-选择隔离级别和传播行为
选择隔离级别的出发点:一致性和性能
选择隔离级别
大部分情况会选着读写提交的方式设置事务,有助于提高提高并发,又压制脏读,但对一致性还存在问题。
使用@Transactional方式进行配置:
@Autowried
private RoleDao =null;
//设置方法为读写提交的隔离级别
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED)
public int insertRole(Role role){
return roleDao.insert(role);
}
总之:隔离级别根据并发的大小和性能来决定。而且对于数据库不同,隔离级别的支持是不一样的,mysql可以支持4种,而oracle只能支持2种隔离级别。
传播行为
传播行为是指方法之间的调用事务策略的问题,一个方法调度另外一个方法时,可以对事务的特性进行传播配置,成为传播行为,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xt9CRATS-1617261765610)(C:\Users\Administrator\Desktop\学习笔记\SSM\img\image-20210401144840191.png)]
spring中传播行为的类型,是通过一个枚举类型去定义的,该枚举类org.springframework.transaction.annotation.Propagation,有7种传播行为:
传播行为 | 含义 | 备注 |
---|---|---|
REQUIRED | 当调用方法时,如果不存在当前事务,那么就创建事务;如果存在,就沿用之前的事务 | spring默认的传播行为 |
SUPPORTS | 当调用方法时,如果不存在当前事务,那么不启用事务;如果存在,就沿用之前的事务 | — |
MANDATORY | 方法必须在事务内运行 | 如果不存在当前事务,那么就抛出异常 |
REQUIRES_NEW | 无论是否存在当前事务,方法都会在新的事务中运行 | 也就是事务管理器会打开新的事务运行该方法 |
NOT _SUPPORTED | 不支持事务,如果不存在当前事务也不会创建事务;如果存在,则挂起,直至方法结束后才恢复当前事务 | 适用于那些不需要事务的 SQL |
NEVER | 不支持事务,只有在没有事务的环境中才能运用他 | 如果方法存在当前事务,则抛出异常 |
NESTED | 嵌套事务,调用方法如果抛出异常只回滚自己内部执行的SQL,不会回滚主方法的SQL | 它的实现存在两种情况,如果当前数据库支持保存点,那么它就会在当前事务上使用保存点技术;如果发生异常则将方法内执行的SQL回滚到保存点上,而不是全部回滚,否则就等同于REQUIRES_NEW创建新的事物运行方法代码 |
最常用REQUIRED,企业中比较关注的:NESTED和REQUIRES_NEW
最常用REQUIRED,企业中比较关注的:NESTED和REQUIRES_NEW