隔离级别 脏读 不可重复读 幻象读READ UNCOMMITTED
时间: 2024-08-13 08:07:36 浏览: 44
在数据库事务管理中,隔离级别(Isolation Level)定义了事务之间的可见性和并发控制。READ UNCOMMITTED(读未提交)是四个基本隔离级别之一,它提供了最低的隔离度,使得事务可以访问其他事务未提交的数据。
**脏读(Dirty Read)**:
在READ UNCOMMITTED下,一个事务可能会读到另一个未提交的事务所做的更改,即使这些更改还未正式保存到数据库中。这意味着在一个事务看到数据更新后,另一个事务可能回滚这些更改,导致第一个事务读到的是“脏”的数据。
**不可重复读(Non-Repeatable Read,NRR)**:
在这个级别,同一个事务在同一时刻内对同一数据的两次读取可能得到不同的结果。这是因为在第一次读取之后,其他事务可能修改了数据,导致第二次读取看到不同的值,即使没有其他事务提交。
**幻象读(Phantom Read,PR)**:
幻象读发生在事务重新运行时,查询结果集发生了变化,尽管并没有其他事务影响这些数据。这可能是因为其他事务添加了新的行,使得原本空的结果集中显示了数据。
总结来说,在READ UNCOMMITTED模式下,存在很高的并发风险,可能导致脏读、不可重复读和幻象读等问题。为了保证数据的一致性,通常会选择更高的隔离级别,如READ COMMITTED或更严格的级别。
相关问题
在@Transactianal注解的属性中,负责设置事务隔离级别的是()
在Java的`@Transactional`注解中,用于设置事务隔离级别的属性通常是`isolation`或`value`。这两个属性可以指定具体的隔离级别,常见的有以下几种:
1. `ISOLATION_DEFAULT`(默认值):由数据库驱动程序选择,默认隔离级别。
2. `ISOLATION_READ_UNCOMMITTED`:读未提交,最低的隔离级别,可能会看到其他事务未提交的数据。
3. `ISOLATION_READ_COMMITTED`:读已提交,保证了对数据的一致性,但不能避免幻读(脏读、不可重复读)。
4. `ISOLATION_REPEATABLE_READ`:可重复读,防止脏读和不可重复读,但可能出现幻象更新。
5. `ISOLATION_SERIALIZABLE`:串行化,最高的隔离级别,完全避免了并发问题,但性能开销最大。
在配置时,你可以这样使用:
```java
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void yourMethod() {
// ...
}
```
或者简写为:
```java
@Transactional(value = Isolation.REPEATABLE_READ)
public void yourMethod() {
// ...
}
```
springboot 事务隔离最低
Spring Boot中的事务隔离级别是由数据库驱动管理的,Spring Boot本身并没有直接提供设置事务隔离级别的API。但是,你可以通过配置数据源或JPA(Java Persistence API)来控制默认的事务隔离级别。
通常,Spring Data JPA会使用`@Transactional`注解来开启事务,并可以使用`propagation`属性来自定义传播行为,默认情况下,如果未指定,隔离级别通常是`ISOLATION_DEFAULT`,这由底层数据库系统决定,通常对应于`READ_COMMITTED`。
Spring Boot支持以下几种常见的事务隔离级别:
1. `ISOLATION_READ_UNCOMMITTED`:最低的隔离级别,读取未提交的数据,可能导致脏读、幻读和不可重复读。
2. `ISOLATION_READ_COMMITTED`:标准隔离级别,保证事务可见性,防止脏读,但可能无法阻止幻读。
3. `ISOLATION_REPEATABLE_READ`:可重复读,防止脏读和幻读,但在并发插入的情况下可能会看到"锁定"幻象。
4. `ISOLATION_SERIALIZABLE`:最高的隔离级别,完全避免了脏读、幻读和不可重复读,但性能开销最大。
如果你需要更改隔离级别,可以在application.properties或application.yml文件中添加如下的JDBC连接池配置:
```yaml
spring.datasource.jta.isolation-level=ISOLATION_REPEATABLE_READ
```
阅读全文
相关推荐









