【Spring的@Transactional注解】
2023-12-27 06:51:48
public class Test {
/**
* Transactional的两个重要属性:
* 1.propagation:用来设置事务的传播行为
* 2.isolation:用来设置事务的隔离级别
*/
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.NEVER)
public void test() {
}
}
一、Isolation 事务的隔离级别
在public enum Isolation中定义了五个表示隔离级别的常量:
- DEFAULT:默认级别,使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
- READ_COMMITTED:读已提交,允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生,开发通常使用的隔离级别。
- READ_UNCOMMITTED:读未提交,最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- REPEATABLE_READ:可重复读,对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE:序列化,最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 | |||
读已提交 | √ | ||
可重复读 | √ | √ | |
序列化 | √ | √ | √ |
二、Propagation 事务的传播行为
- MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
- NESTED:如果被调用的方法存在事务,那么新事务将嵌套在调用方的事务中,而不是直接加入到当前事务中。如果被调用的方法没有事务,那么将创建一个新的事务。
- NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
- REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
文章来源:https://blog.csdn.net/m0_69269392/article/details/135219056
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!