事务的四个特性

在工作中,经常会接触到事务这个概念。涉及到事务,大家首先想到的就是事务的四个特性:ACID。抽空总结和梳理了一下事务的这四个特性。

1.原子性(Atomicity)

1.1什么是原子性

一般来说,原子是指不能分解成小部分的东西。这个词在计算的不同分支中意味着相似但又微妙不同的东西。例如,在多线程编程中,如果一个线程执行一个原子操作,这意味着另一个线程无法看到该操作的一半结果。系统只能处于操作之前或操作之后的状态,而不是介于两者之间的状态。 ACID原子性的定义特征是:能够在错误时中止事务,丢弃该事务进行的所有写入变更的能力。

1.2 如何实现原子性

WAL(预写日志) 是用于保证事务的原子性和持久性。简单来讲,事务更新数据之前,先写日志,然后在更新数据。当系统崩溃时,如果事务还没写WAL,那整个数据依然一致。如果事务只写了WAL,未更新具体的数据页后崩溃,那恢复流程可以根据WAL日志,重做相关操作,保证数据一致性。

2.一致性(Consistency)

ACID一致性的概念是,对数据的一组特定陈述必须始终成立。即不变量(invariants)。例如,在会计系统中,所有账户整体上必须借贷相抵。如果一个事务开始于一个满足这些不变量的有效数据库,且在事务处理期间的任何写入操作都保持这种有效性,那么可以确定,不变量总是满足的。 原子性,隔离性和持久性是数据库的属性,而一致性(在ACID意义上)是应用程序的属性。应用可能依赖数据库的原子性和隔离属性来实现一致性,但这并不仅取决于数据库。

3.隔离性(Isolation)

3.1什么是隔离性

大多数数据库都会同时被多个客户端访问。如果它们各自读写数据库的不同部分,这是没有问题的,但是如果它们访问相同的数据库记录,则可能会遇到并发问题(竞争条件(race conditions))。 ACID意义上的隔离性意味着,同时执行的事务是相互隔离的:它们不能相互冒犯。

如果两个事务不触及相同的数据,它们可以安全地并行(parallel) 运行,因为两者都不依赖于另一个。当一个事务读取由另一个事务同时修改的数据时,或者当两个事务试图同时修改相同的数据时,并发问题(竞争条件)才会出现。出于这个原因,数据库一直试图通过提供事务隔离(transaction isolation) 来隐藏应用程序开发者的并发问题。

serializable级别的隔离,保证事务的效果与连续运行(即一次一个,没有任何并发)是一样的,可以保证事务地安全执行。但是在serializable隔离级别,事务并发度很低,整个数据库的性能肯定不高。这时候,数据库开发人员有提出了四种不同的隔离级别,来平衡事务并发度与隔离性,这四个隔离级别分别是:读未提交(Read Uncommitted):可以读取未提交的记录。

读已提交(Read Committed):事务中只能看到已提交的修改。

可重复读(Repeatable Read):解决了不可重复读问题(MySQL 默认隔离级别)

序列化(Serializable):最高隔离级别。

RU,RC和RR由于降低了隔离要求,自然在读取数据时,会产生各种异常(上帝为你打开一扇门的同时,肯定也为你关上一扇窗):RU会读取其他事务未提交的数据,这就产生了脏读,脏读取意味着另一个事务可能会只看到一部分更新,或者看到的数据已经被回滚了。

RC级别的隔离,会产生不可重复读的问题。所谓不可重复读是指在一个事务内根据同一个条件对行记录进行多次查询,但是搜出来的结果却不一致。发生不可重复读的原因是在多次搜索期间查询条件覆盖的数据被其他事务修改了。

RR级别的隔离,会产生幻读问题。幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

3.2 如何支持隔离性

一般数据库不会考虑工作在RU隔离级别,因为读脏数据会引起太多的问题。数据库一般工作在RC或RR隔离级别,快照隔离级别就可以支持RC或RR隔离级别,所以数据库一般会实现快照隔离级别。

快照隔离的实现通常使用写锁来防止脏写,这意味着进行写入的事务会阻止另一个事务修改同一个对象。但是读取不需要任何锁定。从性能的角度来看,快照隔离的一个关键原则是:读不阻塞写,写不阻塞读。这允许数据库在处理一致性快照上的长时间查询时,可以正常地同时处理写入操作。且两者间没有任何锁定争用。

为了实现快照隔离,数据库必须保留一个对象的几个不同的提交版本,因为各种正在进行的事务可能需要看到数据库在不同的时间点的状态。因为它并排维护着多个版本的对象,所以这种技术被称为多版本并发控制(MVCC, multi-version concurrentcy control)。

最高的隔离级别:Serializable,一般是通过2PL来实现, 一阶段申请,一阶段释放。读写都要加锁。

4.持久性(Durability)

数据库系统的目的是,提供一个安全的地方存储数据,而不用担心丢失。持久性 是一个承诺,即一旦事务成功完成,即使发生硬件故障或数据库崩溃,写入的任何数据也不会丢失。

5.总结

本文总结和梳理了事务的四个特性,并概述了如何实现事务的四个特性。

mysql事务四个特性_事务的四个特性相关推荐

  1. 简述Java事务的四个特性_事务是什么,以及事务四个特性

    事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元): 事务的四大特性 ...

  2. mysql事务保证幂等_事务与一致性:刚性or柔性

    转发自 https://cloud.tencent.com/developer/article/1038871 在高并发场景下,分布式储存和处理已经是常用手段.但分布式的结构势必会带来"不一 ...

  3. 人对光波的三种特性_光线的三种特性——玩转光线的基础知识

    摄影是用光的技术,想用好光线就必须了解光线的特性. 光线的三个特性就是: 1.强度.光的强度与光源的能量距离以及传播介质有关.直观的感觉就是光的明暗程度. 2.方向.就是光源的方向.但是在多光源或者漫 ...

  4. mysql事务中宕机_事务执行一半,业务系统宕机,数据库的数据会怎样?

    业务系统提交了一个数据库dml指令,在尚未进行提交时,系统宕机了.那么数据库的数据会是修改前的,还是修改后的?数据库中的连接是否会断开,数据是否会被锁定?带着这些疑问,我们做的如下测试: 1.在数据库 ...

  5. java事务不生效场景_事务的隔离级别、事务不生效的场景

    一.事务的隔离级别 1.读未提交Read Uncommited:事务还没提交的时候,修改的数据就让别的事务给读到了----脏读 2.读已提交Read Commited:事务A查询一个数据值是1,过了段 ...

  6. mysql实验四图书视图_[数据库实验四.doc

    [数据库实验四 计算机与信息学院实验报告 系: 专业: 年级: 姓名: 学号: 22 实验室号 计算机号 22 实验时间: 2013年10月29日 指导教师签字: 成绩: 报告退发 (订正 . 重做) ...

  7. 超声波的四个特性_超声波的四个特性及应用特性

    超声波的四个特性及应用特性 超声波顾名思义,超过常规声波的声波.声波是指人耳能感受到的一种纵波,其频率范围为16Hz-20KHz.当声波的频率低于16Hz时就叫做次声波,高于20KHz则称为超声波声波 ...

  8. 超声波的四个特性_超声波传感器,超声波的特性

    超声波传感器的超声波是一种人耳无法听到的.频率一般超过20kHz的声音. 超声波的基本特性如下所述: 1. 波长与辐射 波的传播速度是用频率乘以波长来表示.电磁波的传播速度 是3×108m/s,而声波 ...

  9. 超声波的四个特性_超声波的几个特性

    原标题:超声波的几个特性 1.散射与衰减:散射是超声遇到物体或界面时沿不规则方向反射(非90°)或折射(非声阻抗差异所造成的).超声在介质内传播时,会随着传播距离的增加而减弱.这种现象称为超声衰减.引 ...

最新文章

  1. WMI技术介绍和应用——查询系统信息和补丁包信息
  2. python中collections_Python中collections模块的基本使用教程
  3. iOS input被键盘遮挡
  4. Android WebView常见问题及解决方案汇总【很全很实用】
  5. LintCode MySQL 1936. 张三的故事 III
  6. 详细描述三个适于瀑布模型的项目_信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理2...
  7. php多线程是什么意思,多线程是什么意思
  8. Java 1.2.2 格式化输出
  9. iOS中的枚举:enum, NS_ENUM, NS_OPTIONS的使用区别
  10. UVA10735 Euler Circuit题解
  11. LeetCode IPO
  12. 新北京交通限行时间、尾号查询
  13. ubuntu 安装uget 和 flashgot 下载软件相当于windows中的迅雷
  14. 漫谈格兰杰因果关系(Granger Causality)
  15. 电脑关机后电源灯还亮
  16. 数字的ASCII码值转为大写字母
  17. Python基础复习--print()函数、转义符、变量命名
  18. 闭关修炼——one——struts2
  19. Android开发推荐资料大合集 【转载自51CTO】
  20. Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

热门文章

  1. 无法装载文件或者汇编的AjaxControlToolkit
  2. 案例:实现第一个Filter程序
  3. css怎么让div旋转不改变形状,旋转任意角度 如何让div旋转一定的角度
  4. 设计灵感|如果你喜欢多彩的配色搭配!看这里!
  5. 豪横C4D电商实用素材,从此横着走
  6. 平面设计背景素材|打造超酷的炫彩光束光效海报!
  7. 如何更快获取想要的设计资源?
  8. 服务器操作系统版本检查,服务器操作系统版本检查
  9. python金融衍生品_《Python金融衍生品大数据分析:建模、模拟、校准与对冲(博文视点出品)》【摘要 书评 试读】- 京东图书...
  10. java 使用vsphere 创建虚拟机‘_Java数组的创建及使用