数据库隔离级别

一、数据库隔离级别

数据库有四种隔离级别,从低到高,分别是:

  • 未提交读(Read uncommitted):即一个事务能读到另一个事务未提交的数据。
  • 提交读(Read committed):即当事务对数据所做的修改还未提交时,其他事务都只能读到老的数据。
  • 可重复读(Repeated Read):即当有事务操作数据时,不管是读还是写,只要事务还未提交,其他事务就不能修改这条数据。
  • 串行读:完全串行化,每次读写都要获取表级锁。

数据库中默认的隔离级别是“可重复读”。

二、隔离级别实现方案

各种隔离级别都是通过在不同的时间加不同的锁实现的。

  • 未提交读:读的时候不加任何锁。在修改数据的时候只加行级共享锁。
  • 提交读:读的时候对数据加行级共享锁,读完立刻释放锁。在修改的时候,对数据加行级排他锁,直到事务结束才释放。
  • 可重复读:读的时候对数据加行级共享锁,直到事务结束才释放。在修改的时候,对数据加行级排他锁,直到事务结束才释放。
  • 串行读:读的时候对数据加表级共享锁,知道事务结束才释放。修改的时候,对数据加表级排他锁,知道事务结束才释放。

 

三、数据库在没有隔离级别的情况下,会出现的问题

  • 脏读:即事务A读到事务B修改后的数据,但是事务B失败回滚了,导致事务A之前读到的数据是错误的。
  • 不可重复读:即同一个事务读同一条记录,多次读会读到不同结果。因为期间有其他事务对数据进行了修改。
  • 幻读:即同一个事务根据一个条件能查到n条数据,过了一段时间,再查时,发现变成n+1条。

四、不同事务隔离级别,能解决的数据库读取问题

“能”表示能解决,“否”表示不能解决。

  脏读 不可重复读 幻读
未提交读 否 否 否
提交读 能 否 否
可重复读 能 能 否
串行读 能 能 能

 五、 数据库操作

1. 查询数据库隔离级别:

SELECT @@tx_isolation

2. 修改数据库隔离级别:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ| SERIALIZABLE}

  • 隔离级别名称可选值:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE
  • global:设置全局session,但当前session不受影响。
  • session,设置当前和之后的所有session。
  • 都不写:设置当前session下一个还未开始的事务。

 

posted @ 2017-10-27 21:27  kejicjk  阅读(685)  评论(0)    收藏  举报