大白话之数据库事务
本文摘自我的公众号:陶朱公Boy。欢迎大家关注!
--------以下是正文:-------------
什么是事务
定义:由一组操作构成,我们希望这组操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要么全部执行执行,要么全部都不执行。
百度百科: 事务(Transaction)
一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。
事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
数据库事务VS文件系统事务区别与联系
数据库中的事务是数据库区别于文件系统的重要特性之一。
1)在文件系统中如果正在执行写文件操作,这时操作系统突然崩溃了,那这时这个文件极有可能被遭到了破坏。
无法在失败的时候进行回滚。
比如更新两个文件,第一个更新完后,再更新第二个,但过程中,第二个更新过程失败了,此时文件系统没办法让两份文件回到执行前的状态。
2)在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。
例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。
上述两个操作,在一个事务中要么都成功,要么都失败,不会出现中间态情况。
这个过程被称为一个事务,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段内有所说明。[1]
数据库为什么要引入事务
数据库引入事务主要目的:
事务会把数据库从一种一致状态转换为另一种一致状态。
在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有修改都不保存。
这正是数据库区别于文件系统的重要特性之一。
存储的中间件一定都得有事务吗,没有事务可以吗
可以的。
一些存储中间件比如Hbase,不支持事务。但对于低延时的随机读写场景特别合适。
事务场景
数据库事务(本地事务)
本地事务实现原理
-
事务日志
-
并发控制
分布式事务
...
Innodb存储引擎事务特性
InnoDB存储引擎事务完全符合ACID特性。
ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性。
原子性(Atomicity)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency)
一个事务可以封装状态改变(除非它是一个只读的)。
事务必须保证系统始终处于一致的状态,不管在任何给定的时间里,并发事务有多少。
也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性,以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。
隔离性(Isolation)
在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。
也就是说,不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
读未提交
读已提交
可重复读
串行化
持久性(Durability)
在事务完成以后,该事务对数据所作的更改便持久的保存,并不会被回滚。
隔离性下的隔离级别
读未提交
读到别人还没提交的记录,容易引起脏读。
读已提交
读到别人已经提交的记录,容易引发幻读。
幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
引出一个思考题:阿里在部分场景下修改了MySQL默认隔离级别为:读已提交。
大家觉得是出于什么原因考虑?
可重复读
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
串行化
------END------
关注我:
上述文章摘自作者的公众号:陶朱公Boy
公众号内容包括:以下系列文章,欢迎大家关注。也欢迎大家加我微信(公众号有联系方式。还有技术交流群链接,入群后我们可以和一群勤奋好学且可爱的人一起讨论技术等),做个点头之交。
《干货基础知识》
记一次哈啰物联网平台规则引擎kafka消息积压线上事故复盘
mp.weixin.qq.com/s/1FXgn-RWubf7wmmsBHt_1w
手机被告警平台打爆了,内容都是应用CMS GC太频繁,你知道这说明什么问题吗?
mp.weixin.qq.com/s/A0_JWGBsZGINNt1lWjZwxQ
经常在网上听说P0级故障,P1级故障,你知道这意味着什么?有多大的影响面?点击这里看看大厂的故障分制度具体明细
mp.weixin.qq.com/s/Qw2HaRGpkwySOrMiIo2-KA
《高效学习方法论》
我们说好的方法是你和别人拉开差距,让你快速成长的不二法门。
比如:左耳朵耗子在极客写的几篇学习方法:
高效学习:端正学习态度
mp.weixin.qq.com/s/HJJYnyZlI66A36s5Bo-now
高效学习:源头、原理和知识地图-左耳朵耗子
mp.weixin.qq.com/s/0aaAEU6XNAFwA0dz5hJzVA
高效学习:深度,归纳和坚持实践
mp.weixin.qq.com/s/IV2akEwLsz8FqZScf5h1_Q
张朝阳总结的最高效学习方法是什么?答案都在这里!
mp.weixin.qq.com/s/d7g45iA7Mi6M_AjUX0oYaw
都是一些技术大神行之有效的,他们多年在大厂总结、思考的学习方法论,分享给你。
《职场认知篇》
普通程序员和大佬程序员就差这三招!
mp.weixin.qq.com/s/ypjcFfDaS03iMEZq_iH_Tg
如何超过大多数人—左耳朵耗子
mp.weixin.qq.com/s/EaW2H0RgnhsCXvDR5wTrdw
给程序员新手的一些建议
mp.weixin.qq.com/s/1X2hD0vown4XdXSi75VQbw
技术人员的发展之路-左耳朵耗子(阿里资深技术专家)
mp.weixin.qq.com/s/j75ulB4ntNLoPHVO8nxV3A
都是职场认知系列文章,非常值得你阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-08-26 Thread.yeild方法详解