二.事务的隔离级别
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。
以上是关于二.事务的隔离级别的主要内容,如果未能解决你的问题,请参考以下文章