数据库的四种隔离级别的实现方式

说道数据库的四种隔离级别,就要先说数据库的ACID,原子性,一致性,隔离性和持久性,这四种隔离级别就是针对数据库的隔离性,下面针对数据库的隔离性来说说数据库会遇到什么问题,以及每一种隔离级别到底解决了什么问题。

针对隔离性遇到的问题如下:

1.    脏读(如有事务A和B,A读取了B未提交的数据)

2.    不可重复读(如有事务A和B,A负责读取,B负责写入,A连续读的过程中B写入了一次,A前后两次读出来的数据不一样)

3.    丢失更新(如有事务A和B,AB均写入数据,A写入的数据被B覆盖)

4.    幻读(如有事务A和B,A修改表内数据的过程中,B向表内插入了一条数据,A修改完后发现数据并没有被全部修改完)

针对这以上四种问题,产生了以下四种隔离级别(其实可以算是3种,第一种并没有处理以上问题),在说隔离级别之前先简单介绍下实现隔离级别的两种锁模式:共享锁和排他锁,这两种锁都是悲观锁,共享锁也叫S锁,是一种读锁,当一个事物获得了一条数据的共享锁,其它事务也能获得该共享锁,但不能获得排他锁,表明其它事务可读,但不可写。排他锁也叫X锁,是一种写锁,当一个事务对临界区加上排他锁,其它事务就不能获得该临界区的任何锁(共享锁,排他锁)。总结一下就是共享锁保证大家可以一起读,但只能一个人写,排他锁保证只能一个人去处理数据,其他人不能读也不能写。

1.read uncommitted(未提交读):其实我觉得翻译成未提交读很不好,应该根据字面理解翻译成在当前隔离级别下,会读取到没有提交的数据会好得多,在这种模式下,对比4种问题就会发现1-4的问题均解决不了,但这种模式也不是说完全没加锁,在读取时是不会加锁的,但在更新数据时,对其加行级共享锁(其它事务不能更改,但可以读取,导致脏读),事务结束时释放。这种隔离级别未处理任何以上4个问题。

举例说明:

事务A读取某行记录时,事务B也能对这行记录读取更新,当事务B更新记录时,事务A读取到事务B修改的版本,即使事务B未提交。

事务A和B不能同时更新(共享锁保证A获取共享锁时A能读写数据,B能获取共享锁能读,不能写)

2.read conmmitted(提交读):还是说下我的理解翻译:这种隔离级别表示读取的数据是已提交成功的,解决了脏读问题,解决方式是给写数据加行级排他锁,这样写过程是无法读取的,直到事务处理完毕才释放排他锁,给读的数据加行级共享锁,这样读的时候也是无法写的,但是一旦读完该行就释放共享锁。这种模式下虽然处理了脏读,但是并没有处理丢失更新和不可重复读的问题。

举例说明:

事务A负责读,事务B负责写,A读完数据后释放共享锁,B更新数据,事务还未结束,A再读,两次得到数据不一样,产生不可重复读的问题。

同理,事务A获取共享锁,更新数据,然后释放共享锁,B此时获得排他锁,再更新数据,A的数据就可能被覆盖,产生更新丢失的问题。

3.reapetable read(可重复读):理解翻译:在这种隔离级别下可以重复的读取数据了,顾名思义,解决了不可重复读的问题,同时也解决了更新丢失的问题。解决办法:给写的数据加行级排他锁,事务结束释放,给读的数据加行级共享锁,事务结束后释放。这种模式还是没有处理幻读的问题

举例说明:

事务A负责读,事务B负责写,A读完数据后等事务结束才释放共享锁,B更新数据,直到事务结束,A再读,两次得到数据均为A第一次读到的数据,解决不可重复读的问题。

事务A负责读,只为读取的数据加行级共享锁,B在A读过程中向表单中插入新数据,A没有处理到新插入的数据,产生幻读。

4.serializable (序列化):这个没有什么理解翻译,直接看实现就好了,实现也很简单,事务读数据则加表级共享锁,事务写数据则加表级排他锁,幻读问题也得到了解决

猜你喜欢

转载自blog.csdn.net/bamboo_cqh/article/details/81171625