事务中有一个特性叫做“隔离性”,就是多事务之间,不会产生影响。不考虑隔离性就会产生很多的问题:脏读,不可重复读,幻读(虚读)。
**脏读:一个未提交的事务读取到了另一个未提交事务的数据**
举个例子:a员工的工资为1000元,老板开启一个事务修改员工的工资为2000元,但是老板娘此时正在给a员工发工资,因为事务还没有提交是可以回滚的,但是老板娘查看到的工资就是2000元,可是此时老板想再考虑一下把事务给回滚了,尴尬的是工资却已经发出去了,那没有办法,老板这个月零花钱没了,所以说,多么痛的领悟!
---
**不可重复读:说不可重复读之前大家有必要再次明确事务的隔离性(多事务之间,不会产生影响),而不可重复读就是 一个未提交的事务读取到另一个事务刚刚提交的数据。**
这个很好理解吧,哈哈,举个例子:a和b同时开启事务获取同一条数据,数据的值为1000,a把1000修改成了500并成功提交了事务,这边的b并未提交事务,但是又查了一遍这条数据,数据的值也变成了500导致两次查询结果不一致。
---
这里有必要提一下:脏读属于致命的一个问题大家一定不要发生,但是不可重复读只能说是一种现象不会致命
---
**幻读(虚读):幻读和不可重复读类似,就是一个未提交的事务读取到另一个事务刚刚添加的数据。**
---
## 隔离级别
问题产生了,就要有解决方案,就是事物的隔离级别。
通过`@Transactional`注解中的`isolation`参数进行设置:
@Transactiona(isolation = Isolation.隔离级别(默认为可重复读))
Isolation中的成员
package org.springframework.transaction.annotation;
import org.springframework.transaction.TransactionDefinition;
public enum Isolation {
/**
* Use the default isolation level of the underlying datastore.
* All other levels correspond to the JDBC isolation levels.
* 使用底层数据存储的默认隔离级别。
* 所有其他级别都对应于JDBC隔离级别。
* @see java.sql.Connection
*/
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
/**
* 读未提交
*/
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
/**
*读已提交
*/
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
/**
*可重复读(默认)
*/
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
/**
*串行化
*/
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
}
如有帮助,请点赞关注😄