二.事务的隔离级别

Posted 君君的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二.事务的隔离级别相关的知识,希望对你有一定的参考价值。

一.为什么设置隔离级别

    为了避免并发事务带来的问题:更新丢失,脏读,不可重复读,幻读.

①更新丢失:事务1对表修改提交后,事务2又对表修改提交,导致事务1修改的无效;

 ②脏读:事务1修改表后未提交前,事务2就已读取到修改后的数据,一旦事务1回滚,则事务2读的就是脏数据;

 ③不可重复读:针对读取数据本身,事务1读取了表的row1后,事务2编辑了row1,事务1再次读取row1时,数据发生改变;

④幻读:针对读取数据集条数,事务1前后用相同查询条件查询的数据记录数不一致,因为期间由其他事务增加或删除记录数。


二.事务隔离级别

    从低到高依次为Read uncommitted(未提交读),Read committed(提交读),Repeatable read(可重复读),Serializable(序列化)。

 ①Read uncommitted(未提交读):事务1写入数据时,事务2可读但不可操作数据。可通过“排他写锁”实现,但会产生脏读,即事务2能读取到事务1未提交的数据。

②Read committed(提交读):事务1读取数据时,事务2也可读取;若事务1写入数据还未提交,则事务2不能读取。避免了脏读,但会出现不可重复读,即事务1读取数据后,事务2修改了数据并提交,事务1再次读取数据改变。

 ③Repeatable read(可重复读):事务1读取或修改数据时,就对数据加悲观锁,其他事务无法修改该数据,但无法锁住insert的数据,所以在事务1读取或修改数据时,事务2insert了数据,在事务1提交后再次读取时,发现有新增数据,这叫幻读。

 ④Serializable(序列化):提供严格的事务隔离,事务只能一个接一个执行,但花费高,性能低,很少使用。


三.各事务特点总结

隔离级别 脏读 不可重复读
幻读
第一类丢失更新
第二类丢失更新
Read uncommitted
允许
允许 允许 不允许
允许
Read committed
不允许
允许
允许
不允许
允许
Repeatable read
不允许
不允许
允许
不允许
不允许
Serializable
不允许 不允许 不允许 不允许 不允许


四.总结

    大多数数据库默认隔离级别为Read committed如Sql Server和Oracle,即多个事务可同时读取数据,但事务1修改数据未提交时,其他事务不可读取。避免了脏读,具有较好的并发性能。mysql默认隔离级别是Repeatable read。

  



以上是关于二.事务的隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL事物隔离级别及搜索引擎

MySQL:事务四大特性与隔离级别

mysql事务隔离级别的实现原理

Mysql事务隔离级别

mysql事务隔离级别

MySQL事务四个特性 - 事务的四个隔离级别