文章目录
- 1.数据库并发操作带来的主要问题及原因:
- ① 丢失修改
- ② 脏读
- ③ 不可重复读
- 2.四种事务隔离级别的区别以及可能出现的问题:
- ① Read uncommitted(读未提交)
- ② Read committed(读提交)
- ③ Repeatable read(可重复读)
- ④ Serializable(可串行化)
1.数据库并发操作带来的主要问题及原因:
① 丢失修改
当两个或多个事务读入同一数据并修改,会发生丢失修改问题,前一个事务修改的结果会被后一事务所做的修改覆盖。
② 脏读
当一个事务修改某个数据后,另一事务对该数据进行了读取,由于某种原因前一事务撤销
了对该数据的修改,即将修改后的数据恢复原值,相当于没有执行前一事务,那么后一事务读到的就是一个不正确的数据,称为“脏数据”。
③ 不可重复读
一个事务读取某个数据后,另一事务对该数据作了修改,当前一事务再次读取该数据(希望与第一次读取的是相同的值)时,得到的数据与前一次的不一样。
2.四种事务隔离级别的区别以及可能出现的问题:
① Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另一个事务不允许同时进行写操作,但允许其他事务读此数据。该隔离级别可以通过“排他写锁”实现。
避免了丢失修改,却可能出现脏读。也就是说事务B读取了事务A未提交的数据(随后事务A回滚)。
② Read committed(读提交)
读取数据的事务允许其他事务继续访问改行数据,但是未提交的写事务将会禁止其他事务访问该行。
该隔离级别避免了脏读,但是却可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
③ Repeatable read(可重复读)
读取数据的事务将会禁止其他写事务(但允许其他读事务),写事务则禁止任何其他事务。
避免了脏读和不可重复读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。
④ Serializable(可串行化)
提供严格的事务隔离。它要求事务可串行化地并发执行。如果仅仅通过“行级锁”是无法实现事务可串行化的,而通过“表级锁”来实现,即通过对整个表加锁,避免同一事物的两次读之间,表中插入新的记录导致两次读取的记录数
不同,称为幻读
。
可串行化是最高的事务隔离级别,同时并发度会很低,一般很少使用。在该级别下,任何对数据库的读写都不会产生不一致性,但有时不精确的读取时允许的,但写入必须保证正确,常用的隔离级别是Read commited。
事务隔离级别 | 避免问题 | 出现问题 |
---|---|---|
Read uncommitted | 丢失修改 | 脏读 |
Read committed | 脏读 | 不可重复读 |
Repeatable read | 脏读、不可重复读 | 幻读 |
Serializable | 脏读、不可重复读、幻读 |