事务指的是数据库事务,事务指的是一个作为单个工作单元执行的一系列操作,它遵循ACID属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。事务确保了即使在系统故障的情况下,数据库操作要么完全完成,要么完全不发生,从而保证数据的完整性和一致性。
2023/11/27
1.数据操作的几大问题
脏读:脏读发生在一个事务读取了另一个事务未提交的数据。
不可重复读:不可重复读是指在同一个事务内,多次读取同一数据集合时,由于其他事务的修改,后续的读取结果与前面的不一致。
幻读:幻读类似于不可重复读,但它涉及到新增或删除操作,而不是更新操作。幻读发生在一个事务读取了一系列记录后,另一个并发事务插入或删除了一些记录,导致第一个事务在再次读取这个系列时,发现了之前不存在的“幻影”数据。
当我们在JAVA类或方法中开启@Transactional注解,我们的数据操作要么全部完成,要么全部回滚,保证事务的原子性和一致性
2.数据库事务管理的隔离级别
-
数据库的四种标准隔离级别包括:
-
读未提交(Read Uncommitted)
- 最低的隔离级别。
- 允许事务读取尚未提交的更改,可能导致脏读。
- 因为事务可能回滚,所以可能读到假数据
- 锁:没有
-
读已提交(Read Committed)
- 允许一事务读取另一事务已提交的更改。
- 防止脏读,但不可重复读和幻读仍可能发生。
- 锁:设置共享锁(读锁)来防止别人读未提交的数据,读完之后放锁
-
可重复读(Repeatable Read)
- 确保在事务内多次读取同一数据的结果是一致的。
- 防止脏读和不可重复读,但幻读可能发生。
- 总结:在单个事务中读取的数据是一致的,不受并发操作的影响
- 锁:长期共享锁(读锁),事务结束放锁
-
串行化(Serializable)
- 最高的隔离级别。
- 完全隔离事务,防止脏读、不可重复读和幻读,但可能导致性能显著下降。
- 事务之间顺序执行
- 锁:读锁+写锁
在不开启事务的情况下MySQL 默认为 Repeatable Read。
当我们使用默认的@Transactional注解时,mysql的事务管理默认也是Repeatable Read。
如果要更改事务的隔离级别,可以通过注解指定的方式修改
@Transactional(isolation = Isolation.Serializable)