原子性(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. Vue 源码解读(6)—— 实例方法

    前言 上一篇文章 Vue 源码解读(5)-- 全局 API 详细介绍了 Vue 的各个全局 API 的实现原理,本篇文章将会详细介绍各个实例方法的实现原理. 目标 深入理解以下实例方法的实现原理. v ...

  2. 编写资源yaml文件、压力机配置hosts

    资源文件 Deployment/StatefulSet/DaemonSet.Service.Ingress等 参考:https://www.cnblogs.com/uncleyong/p/155710 ...

  3. Linux 查看网卡的MAC地址

    转至:https://www.cnblogs.com/kerrycode/p/13709537.html 如何使用命令查看网卡的MAC地址呢? 下面总结一下查看网卡MAC地址的方式. 1:ifconf ...

  4. killall 、kill 、pkill 命令区别

    转至:https://zhuanlan.zhihu.com/p/87904563 killall 命令 Linux系统中的killall命令用于杀死指定名字的进程(kill processes by ...

  5. HTML背景图加载过慢解决思路

    压缩图片的大小 第一个压缩图片网站 第二个压缩图片网站

  6. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  7. [csi]浅聊ceph-csi组件

    描述   ceph-csi扩展各种存储类型的卷的管理能力,实现第三方存储ceph的各种操作能力与k8s存储系统的结合.调用第三方存储ceph的接口或命令,从而提供ceph数据卷的创建/删除.挂载/解除 ...

  8. laravel 公共类json库封装

    封装常用的接口响应: 创建 response.php 在app下创建如下文件下(目录及文件名可以自己设置) app/common/response.php,在内部补充如下代码: <?php /* ...

  9. social network 中Clustering Coefficient 相关笔记2

    breath_first search 改变了原图的连接情况.

  10. java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

    原来是mysql5.X,升级到8.X,连接数据库就报错: Unable to load authentication plugin 'caching_sha2_password'. 原因分析: 可能为 ...