原子性(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. DHCPv4 Relay场景测试—信而泰网络测试仪实操

    一.测试说明 本文主要介绍DHCPv4 Relay场景的测试仪配置方法以及需要注意的事项. DHCPv4 Relay原理: DHCP中继代理,就是在DHCP服务器和客户端之间转发DHCP数据包.当DH ...

  2. smbms项目核心功能实现

    SMBMS 数据库: 项目如何搭建? 考虑使用不使用Maven?依赖,Jar 1.项目搭建准备工作 搭建一个maven web项目 配置Tomcat 测试项目是否能够跑起来 导入项目中会遇到的jar包 ...

  3. 【C++ 调试】增量链接 Incremental Linking

    概述: Incremental Linking翻译成中文就是"增量链接",是一个链接的参数选项,作用就是为了提高链接速度的.什么意思呢?不选用增量链接时,每次修改或新增代码后进行链 ...

  4. 怎么安装ExpressionTreeVisualizer for Visual Studio 2019

    1.下载  ExpressionTreeVisualizer   https://github.com/zspitz/ExpressionTreeVisualizer/releases    ,  解 ...

  5. 分布式 PostgreSQL - Citus 架构及概念

    节点 Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在"无共享(shared nothing)"架构中相互协调.这些节点形成一个集群,允许 Post ...

  6. 反压缩 js ,我的万花筒写轮眼开了,CV 能力大幅提升

    前言 因为比较菜,所以经常需要读一些别人的代码学习学习. 有源码的代码当然好,但是很多网站不开源.这些网站的 js 又都是打包压缩过的,学习起来很难受. 所以我做了一个小工具,通过修改抽象语法树,来处 ...

  7. LabVIEW,控件快捷菜单,温度转换

    目前正在自学LabVIEW,深感困难重重,我将偶尔发表一些自己的收获,自认为算是干货了, 搜到这篇随笔的朋友们或多或少遇到了些许困难,希望这能帮助到你们. 内容:练习使用LabVIEW中的控件快捷菜单 ...

  8. 谈谈对mvc 的认识?

    由模型(model),视图(view),控制器(controller)完成的应用程序由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;MVC 是一个设计模式,它强制性的使应用程序的输入.处 ...

  9. 一比一还原axios源码(零)—— 概要

    从vue2版本开始,vue-resource就不再被vue所维护和支持,官方也推荐使用axios,所以,从我使用axios至今,差不多有四五年了,这四五年的时间只能算是熟练应用,很多内部的实现和原理不 ...

  10. 记录VMware安装VMware Tools过程及遇到的一些问题

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 本文以CentOS安装为例 为什么要安装VMware Tools ? 便于在Windows 下更好管理虚拟机 便于设置Windows和CentOS ...