暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

二.事务的隔离级别

君君的学习笔记 2021-05-18
194

一.为什么设置隔离级别

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

①更新丢失:事务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。

  



文章转载自君君的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论