数据库的四种隔离级别

数据库的事务:一个逻辑工作单元,在工作单元的一系列操作要么全部执行,要么全部不执行。

四个特性:ACID,原子性(定义),一致性(事务开始前,事务结束后,数据库的完整性没有被破坏),隔离性(四个级别),持久性(事务完成后,对表的修改是永久的)。

问题来了:

 A、数据库的完整性:数据库数据在逻辑上的一致性,正确性,有效性和相容性。完整性约束:1.实体完整性,每一行是表里唯一的实体;2.域完整性,表中的列必须满足数据类型约束(取值范围,数据类型);3.参照完整性,两个表的主关键字和外关键字一致,防止数据丢失或者无意义的数据在数据库扩散;4.用户定义的完整性。

四个隔离级别:

1.Read uncommited。一个事务可以读取另外一个未提交事务的数据。读取到事务未提交但已经改变的数据,而后事务回滚,数据未改变,为脏读。

2.Read commited,一个事务要等到另一个事务提交后才能读数据。在这一级别下,读锁在select完成后就释放,写锁在事务提交后才释放。所以一个事务先读数据,而后由另外一个事务update了表,等该事务结束后,第一个事务再次读表的时候数据发生了变化,为不可重复读。

3.Repeatable read,在读事务未提交时,不允许修改操作。不可重复度对应的是修改(update)操作,如果是insert操作,记录条数不一致的情况可能会发生,为幻读。

4.Serializable,事务串行化顺序执行。避免脏读,不可重复度,幻读,但是导致数据库性能低。

这个时候,会不会对数据库实现隔离级别的原理产生了兴趣?

先来介绍一下数据库的锁:

1.共享锁(S锁):又称读锁,对数据对象加上S锁后,其他事务只能再对数据对象加S锁,而不能加X锁。

2.排它锁(X锁):又称写锁,对数据对象加上X锁后,其他事务无法加锁,直到X锁被释放。

锁的规则:

高并发出现的问题:丢失修改,脏读,不可重复度,幻读。

1.一级封锁协议:事务T修改数据R之前(并不是事务开始)必须先对其加X锁,事务结束(commit+rollback)后释放。会发生脏读,不可重复度,幻读。

2.二级封锁协议:一级封锁协议+事务在读取数据之前必须先加S锁,读完后释放S锁。会发生不可重复度,幻读。

3.三级封锁协议:一级封锁协议+数据在读取数据之前必须先加S锁,事务结束后释放S锁。会发生幻读

Read uncommited级别是由一级封锁协议实现的。

Read commited级别是由二级封锁协议。

Repeatable read级别是三级封锁协议实现的(Innodb默认)。

好吧,我承认,这不能叫原理。

。。。我还会回来的。

原文地址:https://www.cnblogs.com/rookie111/p/8678627.html