数据库(1)事物和事物的隔离等级

这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。

一. 事物的四大特性

  1. 原子性(Atomatic):数据库事物包含的操作需要全部成功,否则进行回滚操作。
  2. 一致性(Consistency):数据得操作前后要保持一致,不会出现预期之外的改变。
  3. 隔离性(Isolation):隔离性是只多个用户并发访问同一数据时,数据库为不同用户开启的事物不会被其他事物干扰,当然隔离性又分为不同的隔离等级。
  4. 持久性(Durability):事物一旦提交,事物修改的数据对于数据库来说是永久的。

对于事物的原子性,一致性和持久性,数据库管理系统都是通过事物日志系统来完成的。
对于事物的隔离性,数据库管理系统一般通过锁和MVCC机制来完成。

二. 事物的隔离等级

在SQL标准中,事物隔离等级分为四种,而不同的DBMS虽然对四种隔离等级实现不同,但都满足了SQL标准。

要注意的一点事,事物的隔离等级主要针对于事物中的读操作(SELECT语句),而对于数据的插入(INSERT),删除(DELETE)和更新(UPDATE)操作,任何隔离等级下都不能同时操作。

  1. 读未提交(READ UNCOMMITTED):这种隔离等级下,数据库不会进行任何加锁和数据版本控制操作,在事物A中进行了修改数据,还没有提交到数据库时,事物B可以读到这个修改。
  2. 读已提交(READ COMMITTED):这种隔离等级下,一个事物只能读到已经提交的事物进行的数据修改。
  3. 可重复读(REPEATABLE READ):这种隔离等级下,一个事物多次读的数据必须是一致的,也就是说第一次SELECT读取的数据就是以后全部SELECT读取的数据。
  4. 串行化(SERIALIZABLE):这种隔离等级下,数据库会保证全部是读写操作都是完全串行的,一个事物操作一个数据时(无论读写操作),其他事物都不能再对这个数据进行写操作。

SQL标准中还给出了几种常见的并发出现的问题:

  1. 脏读:脏读是指一个事物处理过程中读取了另一个事物未提交的数据。
  2. 不可重复读:不可重复读是指一个事物中,多次查询同一行,却返回了不同的结果,因为这行被其他事物修改并提交了。
  3. 幻读:幻读是指事物A对数据进行了修改,而事物B此时添加了一条满足事物A中修改条件的数据,而此时事物A没办法修改这条新插入的数据,事物A再去查看修改后的数据,发现存在没有修改的数据,就像出现了幻觉一样。

根据SQL标准中规定的事物隔离等级和事物并发操作中会出现的问题,我们可以得出如下结论。

这里写图片描述

分析:

  1. 对于read uncommitted级别,因为可以读取未提交的数据,所以会出现脏读,不可重复读和幻读。
  2. 对于read committed级别,因为只能读取事物提交以后的数据,所以避免了脏读,但是依旧存在不可重复读和幻读情况。
  3. 对于repeatable read级别,因为限定了所有读操作只能读到一致的数据,所以避免了不可重复读,但是因为还是可以随意插入数据,所以幻读情况依旧存在。
  4. 对于serialazable级别,因为所有的对同一数据操作的事物都串行化,所以避免了所有问题。

这里要指出的是MYSQL在repeatable read级别就避免了幻读的情况,是因为MYSQL特殊的MVCC机制和next-key lock机制的实现,这点网上很多互相抄袭的博客都说错了。

猜你喜欢

转载自blog.csdn.net/cringkong/article/details/80799162