关系型数据库的事务隔离级别

一、什么是事务隔离级别

关系型数据库中,多事务并发时,在数据读写一致性和并发性能之间取不同侧重点的事务特性叫做事务隔离级别。

二、都有哪些隔离级别

一般关系型数据库中,都有四种事务隔离级别,分别是:可序列化可重复读提交读未提交读

可序列化

实现机制

对选定的对象或范围加读锁和写锁,且这些锁只有在事务结束时释放,其他事务对该事务所涉及的对象的读写将被阻塞。这就使得数据的访问是以串行方式进行,从而保证了数据的一致性。这种方式是最高的事务隔离级别,该级别下不会出现脏读、不可重复度、幻读等情况

缺点

由于数据的读写是以串行方式进行的,导致多事务并发时,数据的可用性严重不足

可重复读

实现机制

对选定的对象加读写锁一直到事务结束,但不会加范围锁。由于不加范围锁,故其并发性稍微高于可序列化方式。

缺点

由于不加范围锁,所以可能会出现幻读

提交读

实现机制

对选定的对象的读时,读取完毕后立即释放读锁,不会等到事务结束。但对选定的对象的写操作所加的写锁会到事务结束时才释放。这会保证,不同事务对同一数据的写操作具有顺序性,不会出现写丢失,对读操作保证读到的数据都是别的事务已提交的数据。

缺点

对于读操作,只保证读到已提交的数据。这可能导致,B事务对某数据多次修改提交期间,被A事务多次读取的该数据结果不一样,这较做不可重读现象

未提交读

实现机制

对数据对象的读写锁都是在读写操作完毕后,立即释放,不会等到事务提交结束。这种方式是数据库最低的隔离级别,多事务并发不会阻塞,从而拥有最出色的事务并发性。

缺点

由于事务并发时,A事务对某数据的写锁不用等到事务提交就释放调,从而导致B事务能在A事务提交前读取到数据的修改,但最终A事务可能并不会提交该数据修改,而是回滚,导致B数据读到脏数据,是为脏读现象。

三、什么是范围锁

对某一范围的数据加锁,从而导致该范围内数据的条数不会变动,也就不会出现所谓的幻读。

比如语句: select from user where age < 18 假设结果有有两条数据。A事务对小于18的数据加范围锁后,B事务就无法再像user表插入一条小于18的数据。

四、什么是脏读、幻读、不可重复读

以如下user表举例

什么是脏读

在未提交读的级别下,如下事务操作会出现脏读:

什么是不可重复读

在提交读隔离级别下,有可能出现不可重复读:

什么是幻读

在未加范围锁的情况下,可能出现幻读:

四、参考链接

https://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2