码迷,mamicode.com
首页 > 数据库 > 详细

数据库隔离级别

时间:2018-03-30 16:26:45      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:删除   读取   情况   ali   共享   解释   结果   jpg   共享锁   

定义

SQL标准定义了4种隔离级别,用来限定事务的哪些改变是可见的,哪些是不不可见的,一般来低级别的隔离级别支持更高的并发,并拥有更低的系统开销。

四种隔离级别

未提交读(Read Uncommitted)

  • 解释:所有的事务都可以看到其他无论是提交还是未提交事务的执行结果

  • 带来问题:会出现脏读现象(读取到别人未提交的数据)。

  • 解决问题:不能解决任何问题,其实对系统的开销、并发性也一般。

提交读(Read Committed)

  • 解释:读到的数据是其他事务提交之后的数据

  • 带来问题:这个级别会出现不可重复读现象(在同一个事务里,前后两次相同的select会读到不同的结果)

  • 解决问题:==这是大多数数据库默认的隔离级别(mysql innodb事务的隔离级别默认是可重复读)==,该级别是可以解决脏读的现象。

可重复读(Repeatable Read)

  • 解释:在同一个事务里,select结果是事务开始时间点的状态,同样的SELECT操作读到的结果会是一致的。

  • 问题:会出现幻读数据(幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行),这时候就需要用串行读隔离级别了。

  • 解决问题:可解决不可重复读的问题,因为这个级别是对行数据锁定,在这个事务里数据,其他的事务对该数据不能修改,但可以插入,从而出现了幻读的情况。

  • 幻读可不可重复读的区别就是,幻读是对数据的新增或者删除,不可重复读是数据的修改。不可重复读、幻读都是使用悲观锁的机制来处理这两种问题,但是MySQL、ORACLE、PostgreSQL等成熟的数据库,出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本并发控制)来避免这两种问题。

串行读(Serializable)

解释:读操作会隐式获取共享锁,可以保证不同事务间的互斥。

附图一张:
技术分享图片

隔离级别设置(mysql)

查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别
select @@global.tx_isolation,@@tx_isolation;

更改会话级的隔离级别

set session tx_isolation=‘read-uncommitted‘;  

更改系统级的隔离级别

set session tx_isolation=‘read-uncommitted‘;  

数据库隔离级别

标签:删除   读取   情况   ali   共享   解释   结果   jpg   共享锁   

原文地址:https://www.cnblogs.com/xckxue/p/8676462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!