1.mysql事务隔离级别
1.1什么是事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。简单理解就是:一系列相关的操作,要么全部成功,要么全部不执行。
1.2事务的 ACID
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性:
1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
1.3 mysql的四种隔离级别和分别存在的问题
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(read-uncommitted | 是 | 是 | 是 |
| 不可重复读(read-committed) | 否 | 是 | 是 |
| 可重复读(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
上面所说的存在的问题,都是针对并发场景下,多个事务之间并行操作,由于mysql设置的隔离级别而可能出现的问题,下面就一一进行详细说明:
-
脏读:A,B两个事务,A开启了事物(begin transaction),进行一个当前读操作(insert,update,delete),但是此时并未进行提交(commit),如果B事务能够读到A事物没有提交的内容,就叫做脏读,因为后续A可能进行回滚之类的操作,这个数据不是最终的数据。在读未提交(read-uncommitted)这个隔离级别下,就会出现这种情况。
-
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致,这个就叫做不可重复读。
不可重复读针对的是两个事物之间穿插update操作,导致每次读到的数据内容不一致
- 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
幻读针对的是两个事物之间穿插insert或者delete操作,导致每次读到数据的条数不一致
参考链接:
https://blog.csdn.net/aizhupo1314/article/details/112384410

浙公网安备 33010602011771号