vlambda博客
学习文章列表

[One question a day]数据库中事务的隔离级别有哪几种?


[One question a day]数据库中事务的隔离级别有哪几种?

    在SQL中定义了四种隔离等级,分别是 READ UNCOMMITTED(未提交读) ,READ COMMITTED(提交读),REPEATABLE READ(可重复读),SERIALIZABLE(串行化)。每一种级别都规定了一个事务中所作的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离等级往往可以执行更高的并发,系统的消耗也更低。

[One question a day]数据库中事务的隔离级别有哪几种?

[One question a day]数据库中事务的隔离级别有哪几种?


[One question a day]数据库中事务的隔离级别有哪几种?

READ UNCOMMITTED(未提交读)

    该级别下,事务中的修改在没有提交之前,对于其他事务也是可见的。事务可以读取没有提交的数据,这也被称为脏读。此级别的性能并不比其他级别好很多,但是缺乏其他级别的很多好处,在实际应用中很少用到。


READ COMMITTED(提交读)

    大多数的数据库系统的默认隔离就是 READ COMMITTED (mysql 不是)。该级别下,一个事务从开始到提交之前,对于其他的事务,都是不可见的。同时,这个级别也被称为不可重复读(nonrepeatable read),因为在事务中执行两次相同的查询,如果期间别的事务执行完成,可能会得到不一样的结果。


REPEATABLE READ(可重复读)

    该级别解决了脏读的问题,保证了一个事务中多次读取同样的记录的结果是一致的。但是理论上,该级别依旧无法解决另一个问题:幻读。幻读指的是当某个事务在读取某个范围内的数据时,另外一个事务又在该范围内插入了新的数据,当之前的事务再次读取该范围的记录时,会产生幻行。


SERIALIZABLE(可串行化)

    该级别是最高的隔离级别。其通过强制事务串行执行,避免了去前面说的幻读。SERIALIZABLE会在读取的每一行数据上都加锁,所以会有大量的超时和锁争用的问题。该级别在实际应用中很少使用,一般只有非常需要确保数据一致性并且可以接受没有并发的情况下,才会考虑使用该级别。