原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作

的失败都会导致整个事务的失败;

一致性(Consistent):事务结束后系统状态是一致的;

隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;

持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难

性的失败。通过日志和同步备份可以在故障发生后重建数据。

补充:关于事务,在面试中被问到的概率是很高的,可以问的问题也是很多的。

首先需要知道的是,只有存在并发数据访问时才需要事务。当多个事务访问同一

数据时,可能会存在 5 类问题,包括 3 类数据读取问题(脏读、不可重复读和幻

读)和 2 类数据更新问题(第 1 类丢失更新和第 2 类丢失更新)。

脏读(Dirty Read):A 事务读取 B 事务尚未提交的数据并在此基础上操作,而 B

事务执行回滚,那么 A 读取到的数据就是脏数据。

时间 转账事务 A

取款事务 B

T1

开始事务

T2

开始事务

T3

查询账户余额为 1000 元第 302 页 共 485 页

T4

取出 500 元余额修改为 500

T5

查询账户余额为 500 元(脏读)

T6

撤销事务余额恢复为 1000 元

T7

汇入 100 元把余额修改为 600

T8

提交事务

不可重复读(Unrepeatable Read):事务 A 重新读取前面读取过的数据,发现

该数据已经被另一个已提交的事务 B 修改过了。

时间 转账事务 A

取款事务 B

T1

开始事务

T2

开始事务

T3

查询账户余额为 1000 元

T4

查询账户余额为 1000 元

T5

取出 100 元修改余额为 900

T6

提交事务

T7

查询账户余额为 900 元(不可重复读)

幻读(Phantom Read):事务 A 重新执行一个查询,返回一系列符合查询条件

的行,发现其中插入了被事务 B 提交的行。第 303 页 共 485 页

时间 统计金额事务 A

转账事务 B

T1

开始事务

T2

开始事务

T3

统计总存款为 10000 元

T4

新增一个存款账户存入 100

T5

提交事务

T6

再次统计总存款为 10100 元(幻读)

第 1 类丢失更新:事务 A 撤销时,把已经提交的事务 B 的更新数据覆盖了。

时间 取款事务 A

转账事务 B

T1

开始事务

T2

开始事务

T3

查询账户余额为 1000 元

T4

查询账户余额为 1000 元

T5

汇入 100 元修改余额为 1100

T6

提交事务

T7

取出 100 元将余额修改为 900 元

T8

撤销事务

T9

余额恢复为 1000 元(丢失更新)第 304 页 共 485 页

第 2 类丢失更新:事务 A 覆盖事务 B 已经提交的数据,造成事务 B 所做的操作丢

失。

时间 转账事务 A

取款事务 B

T1

开始事务

T2

开始事务

T3

查询账户余额为 1000 元

T4

查询账户余额为 1000 元

T5

取出 100 元将余额修改为 900

T6

提交事务

T7

汇入 100 元将余额修改为 1100 元

T8

提交事务

T9

查询账户余额为 1100 元(丢失更新)

数据并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能

就是致命的,数据库通常会通过锁机制来解决数据并发访问问题,按锁定对象不

同可以分为表级锁和行级锁;按并发事务锁定关系可以分为共享锁和独占锁,具

体的内容大家可以自行查阅资料进行了解。

直接使用锁是非常麻烦的,为此数据库为用户提供了自动锁机制,只要用户指定

会话的事务隔离级别,数据库就会通过分析 SQL 语句然后为事务访问的资源加上

合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对

用户来说都是透明的(就是说你不用理解,事实上我确实也不知道)。ANSI/ISO

SQL 92 标准定义了 4 个等级的事务隔离级别,如下表所示:

隔离级别

脏读

不可重复读 幻读

第一类丢失更新 第二类丢失更新第 305 页 共 485 页

READ

UNCOMMITED

允许

允许

允许

不允许

允许

READ

COMMITTED

不允许 允许

允许

不允许

允许

REPEATABLE

READ

不允许 不允许

允许

不允许

不允许

SERIALIZABLE

不允许 不允许

不允许 不允许

不允许

需要说明的是,事务隔离级别和数据访问的并发性是对立的,事务隔离级别越高

并发性就越差。所以要根据具体的应用来确定合适的事务隔离级别,这个地方没

有万能的原则。

事务的 ACID 是指什么?的更多相关文章

  1. 数据库系统中事务的ACID原则

    事务的原子性.一致性.独立性及持久性 事务的原子性是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能 ...

  2. 数据库的事务、ACID及隔离级别

    事务 所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么不做,是一个不可分割的工作单位.例如,在关系数据库中,一条或一组SQL语句.整个程序都可以是一个事务. 事务和程序是两个概念,一个程 ...

  3. 深入学习MySQL事务:ACID特性的实现原理

    事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...

  4. MySQL事务及ACID特性

    一.事物 1.定义:事务是访问和更新数据库的程序执行单元,事务中包含一条或者多条SQL语句,这些语句要么全部执行成功,要么都不执行. 在MySQL中,事务支持是在引擎层实现的,MySQL是一个支持多引 ...

  5. 事务的ACID属性,图解并发事务带来问题以及事务的隔离级别

    事务的概述 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组 ...

  6. 事务的ACID性质

    最近在读黄健宏的<Redis设计与实现>,现在看到了事务这章,由于之前(上学)没有好好整理过数据库事务的四大性质,导致现在(工作)看到了就和第一次知道一样((lll¬ω¬)).还是要把基础 ...

  7. 事务的ACID和四个隔离级别

    在实际的业务场景中,并发读写引出了和事务控制的需求.优秀的事务处理能力是关系型数据库(特别是oracle等商用RDBMS)相对于正当风口的NoSQL数据库的一大亮点.但这也从另一方面说明了事务控制的复 ...

  8. Oracle事务的ACID特性

    Oracle事务的ACID特性 1.原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的. 例如:A帐户向B帐户划账1000,则先将A减少1000 ...

  9. 面试题思考: 什么是事务(ACID)?

    事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元(Unit). 狭义上的事务特指数据库事务.一方面,当多个应用程序并发访问数据库时,事务可以在这些 ...

随机推荐

  1. OpenStack学习系列之十二:安装ceph并对接OpenStack

        Ceph 是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.Ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中,通常 ...

  2. windev中使用DateFile和Query作为表格数据源的一个重要区别

    表格可以使用DateFile(数据表)和Query(查询表)作为数据源,在列表页面中,因为表格一般都设置为不可编辑,所以这两者在表现使用上,区别都不大.尽管如此,我们还是需要清晰的知道,这两者本质上的 ...

  3. C++ 派生类函数重载与虚函数继承详解

    目录 一.作用域与名字查找 1.作用域的嵌套 2.在编译时进行名字查找 3.名字冲突与继承 4.通过作用域运算符来使用隐藏的成员 二.同名函数隐藏与虚函数覆盖 1.几种必须区分的情况 2.一个更复杂的 ...

  4. Nullable<T> 结构 |T? 可为空的值类型

    参考链接:https://www.cnblogs.com/tdfblog/p/Nullable-Types-in-Csharp-Net.html https://www.cnblogs.com/min ...

  5. 图解volatile

    volatile是什么 出去面试的时候,很多面试官都会问你:说说你对volatile的理解. 下面我将用图的方式告诉大家,volatile是什么? 如上图所示:每个线程都有自己的工作内存,同时还能访问 ...

  6. 入门不容易->先从数组说起

    数据结构,平时用得最多,接触最多的也是数组,先从数组说起. 数组的概念  什么是数组 一组数据,一秒钟可以申明1000个变量的骚操作. 存储相同的类型,连续的存储空间. 最重要的一点:按下标找元素. ...

  7. linux中at命令详解

    转至:https://blog.51cto.com/12822117/2121101 at命令: 一:简介: 计划任务,在特定的时间执行某项工作,在特定的时间执行一次,需要安装at服务,apt-get ...

  8. shell脚本创建身份证号

    --作者:飞翔的小胖猪 --创建时间:2021年5月16日 --修改时间:2021年5月16日 说明 运行脚本,用户手动输入信息生成身份证号.该程序的核心在于函数模块化及select的使用. 注意:该 ...

  9. 60天shell脚本计划-9/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月8日 --修改时间:2021年3月12日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  10. idea教程--使用mave创建普通java项目

    1.点击箭头所示的"Create New Project"选项 2.勾选图示所示的"Create From Archetype"复选框,在下面的下拉选项中我们选 ...