数据库隔离级别

Posted xckxue

tags:

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

定义

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‘;  

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

mysql 事务隔离级别 详解

理解 spring 事务传播行为与数据隔离级别

事务隔离级别

事务隔离级别

mysql 的事务隔离级别 及各个隔离级别应用场景,详细

Spring框架默认事物隔离级别