事务的 ACID 是指什么?
原子性(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 是指什么?的更多相关文章
- 数据库系统中事务的ACID原则
事务的原子性.一致性.独立性及持久性 事务的原子性是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能 ...
- 数据库的事务、ACID及隔离级别
事务 所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么不做,是一个不可分割的工作单位.例如,在关系数据库中,一条或一组SQL语句.整个程序都可以是一个事务. 事务和程序是两个概念,一个程 ...
- 深入学习MySQL事务:ACID特性的实现原理
事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...
- MySQL事务及ACID特性
一.事物 1.定义:事务是访问和更新数据库的程序执行单元,事务中包含一条或者多条SQL语句,这些语句要么全部执行成功,要么都不执行. 在MySQL中,事务支持是在引擎层实现的,MySQL是一个支持多引 ...
- 事务的ACID属性,图解并发事务带来问题以及事务的隔离级别
事务的概述 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组 ...
- 事务的ACID性质
最近在读黄健宏的<Redis设计与实现>,现在看到了事务这章,由于之前(上学)没有好好整理过数据库事务的四大性质,导致现在(工作)看到了就和第一次知道一样((lll¬ω¬)).还是要把基础 ...
- 事务的ACID和四个隔离级别
在实际的业务场景中,并发读写引出了和事务控制的需求.优秀的事务处理能力是关系型数据库(特别是oracle等商用RDBMS)相对于正当风口的NoSQL数据库的一大亮点.但这也从另一方面说明了事务控制的复 ...
- Oracle事务的ACID特性
Oracle事务的ACID特性 1.原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的. 例如:A帐户向B帐户划账1000,则先将A减少1000 ...
- 面试题思考: 什么是事务(ACID)?
事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元(Unit). 狭义上的事务特指数据库事务.一方面,当多个应用程序并发访问数据库时,事务可以在这些 ...
随机推荐
- Linux安装Python xlrd、xlwt、xlutils模块
一.安装setuptools: 可以先打开setuptools的python官网看看setuptools软件包如何安装: 1 > wget https://bitbucket.org/pypa/ ...
- [旧][Android] Retrofit 源码分析之执行流程
备注 原发表于2016.04.23,资料已过时,仅作备份,谨慎参考 前言 由于是第一次自己翻看源代码进行学习,加上基础不好,在看源代码的过程中简直痛苦不堪,但同时也暴露出了自己的许多问题.我觉得学习源 ...
- 在服务器的docker里 装anacond3深度学习环境的全流程超基础
背景: 实验室给我分配了一个服务器 已经装好了docker 和nvidi docker . 现在我的目标是创建我自己的docker 然后在我自己的docker里装上anaconda环境. 我以前从 ...
- C# typeof() 和object.GetType() 、Type..GetType()使用和区别
进行学习到表达树了,用动Tpye了.所以整理了以下他们区别和用法 总得来说他们都是为了获取某个实例具体引用的数据类型System.Type.1.GetType()方法继承自Object,所以C#中任何 ...
- 开发Windows程序的三种方式
软件开发方式一共有三种:SDK方式.MFC开发方式.托管环境的开发都是基于消息的开发 SDK方式 原装api的调用SDK方式使用C语言和Windows应用程序编程接口(Windows API)来开发W ...
- C# 属性(一)
C# 中的属性是特殊的方法,该方法只负责对私有字段经行的操作,.我们用反编译查看时候看到真实属性是带()的方法,里面还包含get()和set()方法. 属性完成对私有字段的封装.对类的外部用户来说,属 ...
- Leaflet:LayerGroup、FeatureGroup
LayerGroup(Layer) Layer 用法:把一些Layer集中到一个组Group中,以便作为一个整体进行操作.如果把该Group加入到了Map中,任何从这个Group增加或者移除Layer ...
- pandas模块篇(之三)
今日内容概要 目标:将Pandas尽量结束 如何读取外部excel文件数据到DataFrame中 针对DataFrame的常用数据操作 索引与切片 操作DataFrame的字段名称 时间对象序列操作 ...
- MySql绿色版的安装
MySql绿色版的安装 1.下载 2.配置环境变量,执行命令 mysqld --initialize-insecure --user=mysql 会创建出data文件夹 3.创建my.ini文件 [c ...
- MySQL函数及存储过程
MySQL函数及存储过程 参考文章:https://www.cnblogs.com/wupeiqi/articles/5713323.html 1.函数 1.1内置函数 官方文档:https://de ...