数据库中的事务四大特性和隔离级别

2022-09-03 11:47:53

一、数据库的事务是什么?

  1. 为什么需要事务
    在多个改变数据库中的值操作下其中一个操作发生崩溃,继而会导致此次崩溃后的数据紊乱。
    举个例子:
    转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:

    1.将A账户的金额减少100元
    2.将B账户的金额增加100元
    在这里插入图片描述
    在这个过程中可能会出现以下问题:
    1.转账操作的第一步执行成功,A账户上的钱减少了100元,但是第二步执行失败或者未执行便发生系统崩溃,导致B账户并没有相应增加100元。
    2.转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录。
    3.同时又另一个用户转账给B账户,由于同时对B账户进行操作,导致B账户金额出现异常。

  2. 事务的定义
    数据库事务是构成单一逻辑工作单元的操作集合,是一个不可分割的工作单位,要不这个序列里面的操作全部执行,要不全部不执行。

二、数据库事务四大特性

数据库如果支持事务的操作,那么就具备以下四个特性(ACID):

  1. 原子性(Atomicity)
    事务是数据库的逻辑工作单位,所有操作作为一个整体像原子一样不可分割,事务中包括的诸操作要么全做,要么全不做。
begin;update bankset money=money-100where name='帅哥';-- 在这时间差中会发生异常update bankset money=money+100where name='美女';commit;
  1. 一致性(Consistency)
    事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    一致性状态是指:
    1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)。
    2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
  2. 隔离性(Isolation)
    一个事务的执行不能被其他事务干扰,并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。
    比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
  3. 持续性/永久性(Durability)
    一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。任何事务或系统故障都不会导致数据丢失。
    在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面:
    1.事务的并发执行。
    2.事务故障或系统故障。

数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。

并发控制技术:保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。
日志恢复技术:保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
在这里插入图片描述

三、事务中会发生的四大并发异常问题

  1. 脏读
    一个事务读取了另一个事务未提交的数据。
    在这里插入图片描述

  2. 不可重复读
    不可重复读是指一个事务对同一数据的读取结果前后不一致。脏读和不可重复读的区别在于:前者读取的是事务未提交的脏数据,后者读取的是事务已经提交的数据,只不过因为数据被其他事务修改过导致前后两次读取的结果不一样。
    在这里插入图片描述

  3. 幻读
    幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。
    在这里插入图片描述

  4. 丢失更新
    丢失更新是指事务覆盖了其他事务对数据的已提交修改,导致这些修改好像丢失了一样。
    在这里插入图片描述

四、事务的四大隔离级别

  1. 读未提交(Read uncommitted)
    在读取数据时不会加任何锁,也不会进行检测,可能会读到没有提交的数据。
  2. 读已提交(Read committed)
    只读取提交的数据等待其他事物释放排他锁,读数据的共享锁在读操作完成后会立即释放。这个隔离级别是sql server默认的隔离级别。
  3. 可重复读(Repeatable read)
    像已提交读一样,但共享锁会保持到事物结束才会释放。
  4. 串行化(Serializable)
    类似于可重复读,但锁不仅会锁定所查询的数据,也会锁定所查询的范围,这样就阻止了新数据插入所查询的范围。
隔离级别脏读幻读不可重复读丢失更新并发模型更新冲突检测
读未提交 Read uncommitted悲观
读已提交 Read committed悲观
可重复读 Repeatable read悲观
串行化 Serializable悲观
  • 以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,隔离事务之间的影响是通过锁来实现的,通过阻塞来隔离上述影响,级别越高,加的锁越多,效率越低下。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
  • 在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
  • 事务的隔离级别越低,可能出现的并发异常越多,但是通常而言系统能提供的并发能力越强。

在这里插入图片描述

五、总结

  • 事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。
  • 数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。
  • 事务是数据库系统进行并发控制的基本单位,是数据库系统进行故障恢复的基本单位,从而也是保持数据库状态一致性的基本单位。ACID是事务的基本特性,数据库系统是通过并发控制技术日志恢复技术来对事务的ACID进行保证的,从而可以得到如下的关于数据库事务的概念体系结构。
    在这里插入图片描述
    参考资料:
    《数据库系统概论》
    《数据库系统概念》
  • 作者:大头程序员不头大
  • 原文链接:https://blog.csdn.net/qq_38784203/article/details/123393803
    更新时间:2022-09-03 11:47:53