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