mysql的acid_什么是数据库ACID?
并发主题
什么是数据库ACID?
事务在当今的企业系统无处不在,即使在高并发环境下也可以提供数据的完整性。一个事务是一个只包含所有读/写操作成功的集合。如下图:
一个事务本质上有四个特点ACID:
Atomicity原子性
Consistency一致性
Isolation隔离性
Durability耐久性
原子性
原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。
一致性
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
一致性有下面特点:
如果一个操作触发辅助操作(级联,触发器),这些也必须成功,否则交易失败。
如果系统是由多个节点组成,一致性规定所有的变化必须传播到所有节点(多主复制)。如果从站节点是异步更新,那么我们打破一致性规则,系统成为“最终一致性”。
一个事务是数据状态的切换,因此,如果事务是并发多个,系统也必须如同串行事务一样操作。
在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。
“一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”
大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。
隔离性
事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。
耐久性
一个成功的事务将永久性地改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统突然受到系统崩溃或断电,那么所有未完成已提交的事务可能会重演。
尽管一些数据库系统提供多版本并发控制 MVCC, 他们的并发控制都是通过锁完成,因此,锁会增加执行的串行性,影响并发性。
SQL标准规定了四个隔离水平:
READ_UNCOMMITTED
READ_COMMITTED
REPETABLE_READ
SERIALIZABLE
隔离级别
脏读
非重复读
Phantom read
READ_UNCOMMITTED
allowed
allowed
allowed
READ_COMMITTED
prevented
allowed
allowed
REPETABLE_READ
prevented
prevented
allowed
SERIALIZABLE
prevented
prevented
prevented
脏读
脏读发生在:当一个事务允许读取一个被其他事务改变但是未提交的状态时,这是因为并没有锁阻止读取,如上图,你看到第二个事务读取了一个并不一致的值,不一致的意思是,这个值是无效的,因为修改这个值的第一个事务已经回滚,也就是说,第一个事务修改了这个值,但是未提交确认,却被第二个事务读取,第一个事务又放弃修改,悔棋了,而第二个事务就得到一个脏数据。
非重复读
反复读同一个数据却得到不同的结果,这是因为在反复几次读取的过程中,数据被修改了,这就导致我们使用了stale数据,这可以通过一个共享读锁来避免。这是隔离级别READ_COMMITTED会导致可重复读的原因。设置共享读锁也就是隔离级别提高到REPETABLE_READ。
Phantom 读
当第二个事务插入一行记录,而正好之前第一个事务查询了应该包含这个新纪录的数据,那么这个查询事务的结果里肯定没有包含这个刚刚新插入的数据,这时幻影读发生了,通过变化锁和predicate locking避免。
下图是主流数据库的默认隔离级别:
Database
Default isolation Level
Oracle
READ_COMMITTED
MySQL
REPETABLE_READ
Microsoft SQL Server
READ_COMMITTED
PostgreSQL
READ_COMMITTED
DB2
CURSOR STABILITY (a.k.a READ_COMMITTED)
READ_COMMITED 是正确的选择,因为SERIALIZABLE虽然能在不同事务发生时避免stale数据,也就是避免上述丢失刚刚修改的数据,但是性能是最低的,因为是一种最大化的串行。
mysql的acid_什么是数据库ACID?相关推荐
- oracle、mysql、sqlserver的对比数据库引擎的对比与选型InnoDB解决幻读
1. 所属公司: MySQL是由瑞典MySQL AB公司开发,目前属于 Oracle 旗下产品: Oracle是由美国ORACLE公司(甲骨文)开发的一组核心软件产品: SqlServer是由Micr ...
- 【MySQL篇】第一篇——数据库基础
目录 什么是数据库 主流数据库 基本使用 MySQL安装 连接服务器 服务器管理 服务器,数据库,表关系 使用案例 创建数据库 使用数据库 创建数据库表 表中插入数据 查询表中的数据 数据逻辑存储 M ...
- 数据库ACID四大特性到底为了啥,一文带你看通透
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录 说起数据库四大特性,同学们张口就来,ACID!那为什么要ACID?每种特性的原理又是什么?如何实现的?废话少说,哈 ...
- 阿里云rds for mysql平台介绍_阿里云RDS for MySQL实例创建账号和数据库?
本文介绍如何为RDS for MySQL实例创建账号和数据库. 账号类型RDS for MySQL实例支持两种数据库账号:高权限账号和普通账号.您可以在控制台管理所有账号和数据库,账号拥有的具体权限请 ...
- 同时支持三个mysql+sqlite+pdo的php数据库类_同时支持三个MySQL+SQLite+PDO的PHP数据库类...
PHP学习教程文章简介: 同时支持三个MySQL+SQLite+PDO的PHP数据库类使用方法: // mysql connect $db = new SQL(mysql:host=localhost ...
- Linux下修改mysql的root密码后数据库消失怎么处理
Linux系统下如果没有通过password()函数修改mysql的root密码就会导致mysql数据库消失.有些人可能不知道而直接修改了mysql的root密码,于是产生了mysql数据库消失的问题 ...
- mysql实训报告_mysql数据库技术》实验报告.doc
mysql数据库技术>实验报告 MySQL数据库技术实验报告 系 别 班 级 学 号 姓 名 地点 地点机房 课程名称 MySQL数据库技术 实验名称 实验1 MySQL的使用 实 验 过 程 ...
- mysql 中修改对象_在MySQL中,创建一个数据库后,还可以对象其进行修改,不过这里的修改是指可以修改被创建数据库的相关参数,也可以修改数据库名。...
[多选题]注射时,在( )情况下,采用较高的注射速率. [单选题]通常,所设置的模具温度是指和制品接触的模腔内表面在( ). [单选题]反映某一事件发生强度的指标应选用 [判断题]当试样制备之后 ...
- MySql常用命令集Mysql常用命令showdatabases;显示数据库createdatab
MySql 常用命令集 Mysql常用命令 show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop ...
最新文章
- Mybatis获取参数值的方式
- How change in Console is rendered back into UI
- jzoj3850-Fibonacci进制【斐波那契倍增】
- github创建一个新的tag
- C++语言实现hello world代码
- Linux Ubuntu/Centos7 定时备份mysql数据库
- ESP32-8位数码管
- pentaho mysql_pentaho bi server 配置MySQL数据库
- Ds1302 时钟芯片的使用
- 计量经济学及Stata应用 陈强 第九章模型设定与数据问题习题9.3
- 如何拯救拖延症??11大招总有一招帮你搞定
- 栈顶和栈底(直接明了)
- Oracle导入dmp文件(cmd方式)
- 如何通过BIOS设置自动开机
- ECDSA 签名验证原理及C语言实现
- git拉取代码出现Unpacking objects
- 飞思卡尔 熟悉小车之 舵机篇
- RDkit |基于RDkit计算PBF(Plane of Best Fit)描述符数值
- MySQL数据库(5)
- 修家谱的攀附之风:你祖上是苏东坡,我祖上还是孙悟空呢
热门文章
- 为何python不好找工作k-为何有人说Python不好找工作?
- 转行学python后悔了-你是多少岁转行的?转行后你后悔了吗?
- 输出9*9口诀python-Python输出9*9乘法表的方法
- python for-Python for 循环
- python和java哪个-Python和Java到底哪个更好?
- python中x=x+1的读法-python中a=a+1与a+=1的区别
- python比java简单好学-21、PHP和python/JAVA比,哪个更好学?
- python入门教程共四本书籍-关于 Python 的经典入门书籍有哪些?
- python安装包-Python安装包+安装教程
- python编写程序-30分钟学会用Python编写简单程序