数据库详解之事务
究竟什么是数据库的事务,为什么数据库需要支持事务,为了实现数据库事务各种数据库的是如何设计的。还是只谈理解,欢迎大家来讨论。
1。数据库事务是什么
事务的定义,已经有太多文章写过,我就不重复了。我理解的事务就是用来保证数据操作符合业务逻辑要求而实现的一系列功能。换句话说,如果数据库不支持事务,上面业务系统的程序员就需要自己写代码保证相关数据处理逻辑的正确性。而数据库事务就是把一系列保证数据库处理逻辑正确性的通用功能在数据库内实现,并且尽量提高效率。
举个例子,数据库最开始普及就是在金融业,银行的存取款场景就是一个最典型的OLTP数据库场景,而事务就是设计用来保证类似场景的业务逻辑正确性的。
!〔事务的四个基本特性〕(https:imgblog。csdnimg。cn2967b3d9484c405289d711ef5bf69890。png?xossprocessimagewatermark,typeZHJvaWRzYW5zZmFsbGJhY2s,shadow50,textQ1NETiBAd2luZHRhbGtlcnd5,size20,colorFFFFFF,t70,gse,x16)
原子性,如果你要给家人转账,必须在你的账户里扣掉100块,在家人账户里加上100块,这两笔操作需要一起完成,业务逻辑才是正确的。但是程序在做修改的时,肯定会有先后顺序,试想一下程序扣了你的钱,这个时候程序崩溃了,家人账户的钱没有加上。那这100块是不是消失了?你是不是要发疯?那么,就把这两笔操作放进一个事务里,通过原子性保证,这两笔操作要么都成功,要么都失败。这样才能保证业务逻辑的正确性。
一致性,有很多文章讲过一致性,但是很多人会把一致性跟原子性混在一起说。事务的一致性指的是指每一个事务必须保证执行之后所有库内的规则依旧成立。比如内外键,constraint,触发器等。举例来说,你在储蓄卡里有100元,理财账户里有100元,基金账户有100元,那么你在资产总和里会看到300元,这个300元必须是其他三个账户余额加在一起得到的。你在给家人转帐100元是从储蓄卡里转出去了100元,那么在数据库上可以通过创建触发器的方式,当储蓄卡余额账户减100元的同时,把资产总和也同步减去100,不然的话,就会出现逻辑上的错误,因为你已经转走了100块储蓄卡余额,实际资产总和应该是200,如果还是300,数据库状态就不一致了。所以实现事务的时候,必须要保证相关联的触发器以及其他所有的内部规则都执行成功,事务才能算执行成功。如果在减去资产总时出错,那么这笔转帐交易也不能成功。因为这样数据库就会进入不一致的状态。
那么这里跟原子性的区别到底在哪里呢?原子性是指个多个用户指令之间必须作为一个整体完成或失败,而一致性更多是数据库内的相关数据规则必须同时完成或失败。
持久性,最容易理解的一个,事务只要提交了,那么对数据库的修改就会保存下来不会丢了。简单来说,只要提交了,数据库就算崩溃了,重启之后你刚存的100块依然在你的账户里。
隔离性,每个事务相对于其他的事务是有一定独立性的,不能互相影响。因为数据库需要支持并发的操作来提高效率。在并发操作时,一定要通过操作之间的隔离来保证业务逻辑的正确性。比如,你转帐100块给家人,一系列操作的最后一步可能是输入验证码,这个时候转帐还没有完成,但是在数据库里你的账户对应的记录中已经减去100块,家人账户也加了100块,就等着验证码输入以后,事务提交,完成操作。那么,这个时候,家人通过手机银行能够查到这100块么?你的答案可能是不能,因为这样才符合业务逻辑,因为你的转帐操作还没有提交,事务还没有完成。那么数据库就应该保证这两个并发操作之间具有一定的隔离性。
那么到底应该隔离到什么程度呢?隔离性又分为4个等级:由低到高依次为Readuncommitted(读未提交)、Readcommitted(读提交)、Repeatableread(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻象读这几类问题。这些东西是什么意思?请有兴趣的小伙伴自行百度,很多文章都写的很清楚。
那么怎么理解不同的隔离等级呢,首先要理解并发操作,并发操作就是指有不同的用户同时对一个数据进行读、写操作,那么在这个过程中,每个用户应该看到什么数据才能保证业务逻辑的正确性呢?如果是前面存取款的场景,我必须看到的是已经存进来的钱,也就是必须是已经提交的事务。而12306刷火车票呢,你可以看到有10张余票,但是在下单的时候告诉你票卖完了,因为同时有10个用户把票买掉了,你需要重新刷余票,这个也是可以接受的,也就是说我可以读到一些虚假的余票,这样在业务上也没有什么问题。那么在设计这两个不同系统时,就可以选择不同的事务隔离级别来实现不同的并发效果。不同的隔离等级就是要在系统的并发性和数据逻辑的严谨性之间做出的平衡。
2。数据库如何实现事务
数据库实现事务会有多种不同的方式,但基本的原理类似,比如都需要对事务进行统一的编号处理,都需要记录事务的状态(是成功了还是失败了),都需要在数据存储的层面对事务进行支持,以明确哪些数据是被哪些事务、插入、修改和删除的。同时还会记录事务日志等,对事务进行系统化的管理以实现数据的原子性,一致性和持久性。
要实现事务的隔离性,最基础的就是通过加锁机制把并发操作适当的串行化来保证数据操作的正确逻辑。但是为了要保证系统具有良好的并发性能,必须要在实现事务隔离性时需要找到合理的平衡点。大部分数据库(包括Oracle,MySQL,Postgres在内)在做并发控制的时候都会采用MVCC(多版本并发控制)的机制来保证系统具有较高的并发性,不同数据库实现MVCC的具体方案也不尽相同,但其基本原理类似。
3。MVCC实现原理
所谓MVCC,就是数据库中的同一查询根据相关事务执行的先后顺序以及隔离级别的不同,可能会存在不同版本的结果,通过这样的手段来保证大部分查询操作不会被修改操作阻塞并保证数据逻辑的正确性。也就是数据库通过保存多个版本的数据(历史数据)来提高系统的并发查询能力。简单来说就是用存储空间来交换并发能力。下面以Postgres为例介绍一下MVCC的一种实现方式帮助大家理解这个重要的数据库概念。通过下面的图来解释Posrgres里最基本的数据可见性是如何实现多版本控制的。
!〔在这里插入图片描述〕(https:imgblog。csdnimg。cnfd880f62b48d4a43986fa9c7d1a79e4e。png?xossprocessimagewatermark,typeZHJvaWRzYW5zZmFsbGJhY2s,shadow50,textQ1NETiBAd2luZHRhbGtlcnd5,size20,colorFFFFFF,t70,gse,x16)
首先,Postgres里的每一个事务都有编号,这里可以简单理解为时间顺序编号,编号越大的事务发生越晚。然后,数据库里的每一行记录都会保存创建这条记录的事务号(Cre),也会在记录删除时保存删除这条记录的事务号(Exp),换句话说,只要Exp这里一列里记录了事务编号,就说明这条记录被删除了。那么一个事务应该能看见那些记录呢?Postgres里每一个事务都会保存一个当前系统的事务快照(Snapshot),这个快照里会保存事务创建时当前系统的最高(最晚)事务编号,以及目前还在进行中的事务编号。那么如上图所示的一个事务的快照里最高事务编号为100,目前正在进行的事务有25,50和75。那么对应左边数据记录,这6行数据的可见性就如同标注的一般:
第一行,Cre30,没有删除,在100这个时间点,应该能看到。
第二行,Cre50,没有删除,但是50这个事务还没有提交,正在进行中,所以看不见。
第三行,Cre110,没有删除,但是100这个时间点110事务还没有发生,所以看不见。
第四行,Cre30,Exp80,在80的时候数据被删掉了,所以看不见。
第五行,Cre30,Exp75,在30的时候被创建,75时候被删掉了,但是75这个事务在100的时候还没有提交,所以这条记录在100的时候还没有删掉,所以看得见。
第六行,Cre30,Exp110,在30的时被创建,110时候被删掉,但是在100时候,110还没有发生,所以看得见。
综上,就是这个事务对这六条记录的可见性,也就是一个数据版本。那么大家可以看一下如果另一个事务的快照里存的是最高事务编号为110,正在进行的事务为50,那么它能看到的数据应该是哪几行呢?同时大家也看到,Postgres里删除一行数据其实就是在这一行的Exp这个列记录一个删除事务的编号,相当于做了一个删除标记,而数据没有真正被删除,因此Postgres数据库需要定期做数据清理操作(Vacuum)。Pstgres的在现实场景里会比这里介绍的要复杂,因为我们这里假定所有的事务最终都是正确提交了,如果存在某些事务没有提交的情况,那么可见性就会更加复杂,这里不再展开了。
数据库事务是基本的数据库概念,之前已经有很多很好文章做过介绍,这里希望能把自己的理解用比较通俗的描述分享给大家,欢迎来讨论交流。
从小鹏P5到上汽大通MAXUSEUNIQ6,出色的颜值让新能作为全球首款搭载激光雷达的量产车,9月15日上市的小鹏P5,它凭借着性价比、智能科技、动力续航等方面的优势,引起了全网车迷的广泛关注。小鹏汽车作为一款面向15万元级别的新能源车……
腾讯网易纷纷放弃独家版权,但想实现听歌自由,没那么简单文AI财经社杨俏编辑杨洁独家版权成为了过去,国内在线音乐市场或将迎来新的变局。8月31日,腾讯控股与腾讯音乐娱乐集团发布了《关于放弃音乐版权独家授权权利的声明……
2022年及以后的在线购物趋势电子商务一直在变化。亚马逊和eBay的小卖家以及大型零售商都可以从紧跟在线购物趋势和寻找优化电子商务商店的方法中受益。毕竟,技术的进步往往会导致电子商务在现实世界中的日常使用。……
网络安全公司MandiantInc。(MNDT。US)大涨近智通财经APP获悉,据知情人士透露,微软(MSFT。US)正在就收购网络安全研究和事件响应公司MandiantInc。(MNDT。US)进行谈判,这笔交易将加强微软保护客户免受……
魅族19重拳出击,18G运存78W快充,4K无挖孔直屏极其亮魅族和小米、华为几乎是同时出道的,但如今三大厂商的局面却大不相同。小米成了三者之中市场份额占比最高的,小米凭借着性价比打败了不少同行竞争者,同时也赶超了华为。而华为其实是实力最……
网络谣言粉碎机电池充电要充到100,对电池更好流言内容:给手机充电时要彻底充满,这样能让电池寿命更持久。真相解读:经常给手机充电至100,对手机中的锂离子电池并不好。因为这种电池之所以能够工作,靠的是锂离子在正负极之……
iPhone和Mac芯片最早可能在2025年采用2纳米制程据DigiTimes报道,苹果的iPhone和Mac芯片最早可能在2025年采用2纳米制程,因为该公司的主要芯片供应商台积电已经启动了一项计划,将在2025年初生产这种制程的芯……
解决多硬盘盘符混乱问题解决多硬盘盘符混乱问题现象:在安装了第二块硬盘后,老硬盘与新硬盘上的盘符会出现交叉的现象,在调用文件的时候就会出现很多麻烦,甚至导致某些程序无法使用。方法:1……
什么叫做RIC助听器?您好!什么叫做RIC助听器?RIC指的是助听器中的受话器外置的一种。这种助听器属于耳背式的一种,但是它比常规耳背式更小巧,不易被察觉。功能方面也比定制机更多,按键齐……
京东的线下门店的类型京东,中国自营式电商企业,创始人刘强东担任京东集团董事局主席兼首席执行官。旗下设有京东商城、京东金融、拍拍网、京东智能、O2O及海外事业部等。2013年正式获得虚拟运营商牌照。……
乐视手机又来了,发布了一款低端机,毫无亮点乐视手机曾经有过辉煌,设计ID功能都有独特之处,重要是性价比还很高,据统计,2015年4月发布乐1到2016年12月份,乐视手机总销量达到2000万台,到2017年,乐视日活跃……
能分享几张特别漂亮的真实风景照吗?这是冬天的大美黄山,和朋友们一起分享〔耶〕现分享几张我自己用手机拍摄的漂亮的真实风景照片。我去新疆著名的中国最美公路独库公路旅游时,拍下了几张独库公路中段穿越天山山……
什么品牌的空调用的人多?我小区都是海尔品牌占比每个区域有不同的占比。例如,湖北地区家用中央空调市场,日立占有率是排名第一的。其实选空调有几个点自己要注意,第一就是产品的安装,因为中央……
矿机的算力为什么在显卡上,而不是CPU处理器呢?之所以挖矿用显卡而不用CPU,关键在于显卡的核心部件GPU,GPU作为图形处理器,它其实也是一种高性能计算芯片,GPU也具备很强的运算能力,只不过GPU的运算能力跟CPU的侧重……
97岁的杨振宁,阻止中国投入1400亿建大型粒子对撞机97岁的杨振宁冒着晚节不保的风险,也要阻止中国投入1400亿建大型粒子对撞机,并扬言:中国缺少不是技术,而是顶尖高能物理人才,否则就算是建成大型粒子对撞机,也是为他国做嫁衣!……
从爱奇艺裁员来谈谈互联网企业今后的发展前段时间阿里巴巴刚爆出要裁员2万人,今天又爆出爱奇艺也要裁员2040,互联网行业的发展也许真的到顶了,或者说,增量发展阶段已经结束了,接下来将会是存量的竞争了,是不是预示着未来……
李佳琦和薇娅还是走上了辛巴的老路,网红带货的前途在哪?什么是辛巴的老路!那就是私域流量!辛巴对私域流量价值的利用,在电商中绝对是翘楚!辛巴的粉丝曾张狂的说过这么一句话:只要辛巴一声令下,我们7000万铁粉敢叫日月换新天。……
缝纫机器人问世!22秒一件T恤,未来adidasT恤成本仅为未来一件阿迪达斯T恤的成本价是2人民币售价将是成本价的大几十倍这不是天方夜谭一切都归因于能够处理柔软布料的缝纫机器人问世如今机器……
轻薄本的理想伴侣,AENZR3款USB最近这几年,外界对拓展坞的需求量越来越大。因为很多主流笔记本都主打便携性,将那些繁琐的接口都通通给淘汰掉了,最终留下来的只有USBC多功能接口。因此很多人在需要连接外设的时候都……
5G北斗AI齐上阵无人驾驶车队码头高效装卸集装箱目前,全球港口95以上的集装箱码头都是传统人工操作,属于典型的劳动力密集型产业。人工作业劳动强度大且效率越来越难以匹配码头发展需求,如何在传统集装箱码头基础上进行技术升级改造,……
币圈那些事对冲基金Citadel创始人:以太坊最终会取代比特币金色财经报道,美国对冲基金Citadel的首席执行官肯尼斯格里芬(KennethGriffin)在纽约时报主办的一次峰……
编程语言简史软件编程的远古时代计算机软件编程是一个新兴行业,程序员这一职业的出现不过半个多世纪,但是追溯人类从事软件编程的探索却更为久远。在计算机出现之前,甚至在蒸汽机发明之前,人类……
PetalSearchtheme。xmlabcactionbarupcontainer。xmlabcfadein。xmlabcfadeout。xmlabcslideinbot……
百度到2030年将推动交通减碳7000万吨北京商报讯(记者魏蔚)12月29日,百度和IDC联合发布《智能减碳,激发绿色转型动力2021年中国人工智能助力双碳目标达成白皮书》(以下简称《白皮书》)。《白皮书》指出,人工智……