数据库事务并发问题
1、脏读
- A将某条数据由50改为10;
- B读取数据为10;
- A回滚,数据恢复到了50;
这个时候B读取的10就是一个无效的值(脏数据)。
2、不可重复读
A读取某条数据为50;
B修改为20;
A再读取为20,和第一次读取的不一致。
3、幻读
A读取User表的一部分数据;
B想User表写入了新的行;
A再次读取User表,多了一些行。
扫描二维码关注公众号,回复: 12411287 查看本文章![]()
这些现象中,脏读我们是不允许的。
为了应对这些现象,数据库定义了事务的隔离级别(一个事务与其他事务的隔离程度称为隔离级别)
读未提交:read uncommited
允许A读取B未提交的修改,在这种隔离级别下,脏读可能发生。
- 读已提交:read commited
要求A只能读取B已经提交的修改,可能出现不可重复读、幻读
- 可重复读:repeatable read
同一事务(A)期间,可以多次从一个字段中读取到相同的值,即A执行期间,禁止其他事务对这个字段进行更新。可能出现幻读
- 串行化 serializable
确保同一个事务(A)可以从一个表中读取到相同的行,即在A执行期间,禁止其他事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下
隔离级别解决并发问题能力表 脏读 不可重复读 幻读 read uncommited 存在 存在 存在 read commited 存在 存在 repeatable read 存在 serializable
不同数据库对事务隔离级别的支持,(实际上,MySQL在repetable read级别已经没有问题了) Oracle MySQL read uncommited √ read commited √ √ repeatable read √ (默认) serializable √ √