事务的ACID特性(转)
ACID特性
数据库中的事务(Transaction)有四个特性,分别是:原子性(Atomicity),一致性(Consistency),隔离性(lsolation),持久性(Durability)
所谓事务,它是一系列操作的序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行逻辑功能的一组指令或者操作称之为事务)
详解
1. 原子性
原子性是指一个事务是一个不可再分割的工作单位,事务中的操作要么都执行,要么都不执行
例如:
A给B转账,如果B的账户操作失败,则本次交易失败,A和B的账户都不会进行修改。
2. 一致性
一致性是指在执行一个事务前和后,数据库的完整性约束没有没有被破坏。也就是说事务不能破坏数据库的完整性以及业务逻辑的一致性。
例如:
业务逻辑一致性:A给B转账,无论是否操作成功,两者的账户余额之和应该是不变的。
数据库完整性:数据库的约束关系应该是正确的,例如唯一索引,主键等。
3. 隔离性
隔离性是指多个事务并发时,每个事务应该是隔离的,一个事务不应影响其他事务的运行效果
在并发环境当中,当不同的事务访问相同的数据时,每个事务都有各自的完整的数据空间,由于并发事务所做的修改必须与并发的其他事务的修改隔离,所以事务查看数据更新时,数据所处的状态要么是另一个事务开始前的状态,要么就是另一个事务结束后的状态,不会查看到中间状态数据。
事务最复杂的问题都是由隔离性引起的,但是完全的隔离是不现实的,完全的隔离要求数据库同一时间只能执行一个事务,这样会严重影响性能。
事务并发问题
要了解事务的隔离级别,那么就要先了解事务并发会面临的问题
1. 脏读:事务A读取了事务B的更新的数据,但是事务B回滚了,导致A读取的为脏数据。
2. 不可重复读:事务A读取同一数据两次,但是在两次之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致
3. 幻读:事务A修改全表的数据,在未提交时,事务B向表中插入或删除数据,导致事务A读取的数据与需要修改的数据不一致,就和幻觉一样。
注意:不可重复读和幻读很容易混淆,不可重复读针对的时数据的修改,幻读针对的时数据的新增和删除。解决不可重复读问题只需要给对应记录上行锁,而解决幻读需要对表加锁。
隔离级别
1. 未提交读(read uncommitted),就是不做隔离控制,可以读到“脏数据”,比如A和B转账,当A账户修改后,在执行B账户修改时,事务还未提交,其他事务同样需要读取A账户的数据,那么这个时候是可以读到A账户修改后数据的。但是这个时候如果处理失败,则会导致其他事务读取的A账户的数据是错误的,这个问题就叫做脏读。显然这个隔离级别没有太大意义,现实中没有人会用,除非这个应用只有读取,没有任何写入。
2. 提交读(read committed),提交读就是不允许读取事务没有提交的数据。显然这种级别可以避免了脏读问题。例如A和B转账,当A账户修改后,在执行B账户修改时,事务还未提交,其他事务同样读取A账户的数据,那么这个时候读取的应该是事务开始前的数据(也就是A账户修改前的数据)。但是当其他事务在事务开始前读取,同时在事务结束后读取,这样会造成两次读取数据不一致的情况(因为两次查询到的数据是不一样,所以这个问题叫做不可重复读)。这个隔离级别是大多数数据库(除了mysql)的默认隔离级别。
3. 可重复读(repeatable read),与提交读(不可重复读)相对应,为了避免提交读级别不可重复读的问题,在事务中对符合条件的记录上排他锁,这样其他事务不能对该事务操作的数据进行修改,可避免不可重复读的问题产生。由于只对操作数据进行上锁的操作,所以当其他事务插入或删除数据时,会出现幻读的问题,此种隔离级别为Mysql默认的隔离级别。
4. 序列化(Serializable),在事务中对表上锁,这样在事务结束前,其他事务都不能够对表数据进行操作(包括新增,删除和修改),这样避免了脏读,不可重复读和幻读,是最安全的隔离级别。但是由于该操作是堵塞的,不能够让其他事务进行操作,因此此种隔离级别性能会受到影响。
隔离级别解决事务并发问题表
事务隔离级别 脏读(Dirty Read) 不可重复读(No repeatable redad) 幻读(Phantom Read)
读未提交(read-uncommitted)	是	是	是
不可重复读(read-committed)	否	是	是
可重复读(repeatable-read)	否	否	是
串行化(serializable)	否	否	 
4. 持久性
持久性意味着事务执行完成后,该事务对数据库的更改便持久到了数据库中,这个更改是永久的。
事务的ACID特性(转)的更多相关文章
- 深入学习MySQL事务:ACID特性的实现原理
		
事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...
 - MySQL事务及ACID特性
		
一.事物 1.定义:事务是访问和更新数据库的程序执行单元,事务中包含一条或者多条SQL语句,这些语句要么全部执行成功,要么都不执行. 在MySQL中,事务支持是在引擎层实现的,MySQL是一个支持多引 ...
 - Oracle事务的ACID特性
		
Oracle事务的ACID特性 1.原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的. 例如:A帐户向B帐户划账1000,则先将A减少1000 ...
 - [MySQL] 事务的ACID特性
		
事务的ACID特性: 原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中的所有操作要么都做,要么都不做. 一致性(consistency):事务前后数据的完整性必须保持一致.事 ...
 - 分布式事务(ACID特性、CAP定律)
		
普通事务和分布式事务的区别: 普通事务就是一般所说的数据库事务,事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成.当事务被提交给了DBMS(数据库管理系统),则DBMS(数 ...
 - 深入理解大数据之——事务及其ACID特性
		
目录 事务简介 事物的定义 事务的目的 事务的状态 事务的ACID属性 ACID简介 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durabi ...
 - 数据库中事务的ACID特性
		
数据库中事务的ACID特性 前言前面我们介绍过数据库中 带你了解数据库中JOIN的用法 与 带你了解数据库中group by的用法 的相关用法.本章节主要来介绍下数据库中一个非常重要的知识点事务,也是 ...
 - 事务的ACID特性
		
事务(Transaction)是并发控制的基本单位. 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐号扣款并使另一个帐号增 ...
 - 一文说尽MySQL事务及ACID特性的实现原理
		
MySQL 事务基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL 支 ...
 
随机推荐
- python--日志模块
			
一.logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作 1. Logger 记录器,暴露了应用程序代码能直接使用的接口:简单点说就是一个创建 ...
 - python web 2
			
思路整理 过程:请求豆瓣电影 top 250 url='https://movie.douban.com/' 结果:得到网页的html 源码 (保存为hml文件 就可以用浏览器打开) 提示: Loca ...
 - 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!
			
日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 “SYSDATE”来指定查询的日期. SELECT TRUNC (SYSDATE, 'MO ...
 - 【密码技术】Part 4 SSL/TLS
			
01 SSL/TLS基本概念 02 TLS协议流程图
 - .NET反射简单应用———遍历枚举字段
			
反射(Reflection)是一个非常强大的工具,可以用来查看和遍历类型和类型成员的元数据:动态创建类型实例,动态调用所创建的实例方法.字段.属性:迟绑定方法和属性.此次要介绍的是使用反射查看类型成员 ...
 - vue中computed、metfods、watch的区别
			
一.computed和methods 我们可以将同一函数定义为一个 method 或者一个计算属性.对于最终的结果,两种方式确实是相同的. 不同的是computed计算属性是基于它们的依赖进行缓存的. ...
 - postman安装
			
安装包下载下来,解压缩到你喜欢的位置. 打开 Chrome 浏览器的「扩展程序」 点击「加载已解压的扩展程序...」按钮,找到你刚刚下载的安装包的位置,点击确定. 你去看看 Windows 的开始菜单 ...
 - 显式拥塞通告(ECN)及其在Linux上的实现
			
1 ECN简介 首先看看ECN握手报文的特点,根据RFC3168,ECN握手报文IP头部不能够设置ECT和CE位的 SYN报文TCP标志字段的CWR和ECE位被置1 SYN-ACK报文的CWR位被置0 ...
 - 开通blog,记录学习历程
			
2017.12.15日,开通blog,用于回忆知识点的记录和整理. 开通本blog主要做以下几点事情: 1.巩固知识点,基础打牢: 2.在基础牢固的基础上,学习流行的框架: 3.在框架牢固的基础上学习 ...
 - Java容器解析系列(9) PrioriyQueue详解
			
PriorityQueue:优先级队列; 在介绍该类之前,我们需要先了解一种数据结构--堆,在有些书上也直接称之为优先队列: 堆(Heap)是是具有下列性质的完全二叉树:每个结点的值都 >= 其 ...