SSM-Spring-数据库事务管理-选择隔离级别和传播行为

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

猜你喜欢

转载自blog.csdn.net/weixin_43958223/article/details/115375255