MySQL数据库事务的机制【总结】


这几天面试多次被问到了数据库事务机制、隔离级别、乐观锁悲观锁类的问题,之前对这些只能说有所了解,有些概念还停留在记忆层面,没有理解,所以回答的不好。后面翻书学习了下,理解了一些东西,在此做一个记录。

 

启科网络PHP商城系统 启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

启科网络PHP商城系统 0 查看详情 启科网络PHP商城系统

什么是事务?

事务我理解的是一个完整的业务行为,一个业务行为可能包含多个动作,这个完整的动作就构成一个事务。比较经典的例子是银行转账,A账户转到B账户,需要两个动作:A账户减,B账户加,必须保证这两个动作要么都做,要么都不做。

事务具有ACID特征,具体包括:

● 原子性(atomicity):原子性是说事务的不可分割,要么全成功,要么全失败,不可部分成功,部分失败。半途失败的情况下,需要打扫战场,也就是数据回滚。

● 一致性(consistency):一致性是说事务的最后结果,要保证数据上没有异常。一致性是强调结果,是建立在原子性上实现的,也就是说能保证原子性,那就会有一致性的结果。

● 隔离性(isolation):隔离性是说事务没有提交前对其他事务是不可见的,事务间数据是隔离的(当然不同级别隔离程度不一样)。

● 持久性(durability): 事务提交后会持久化,可以长久保存。

 

事务隔离级别

了解事务的隔离级别之前,需要明白数据读取的几个概念:

● 脏读:就是读到了别人还没提交的数据。

● 可重复读:就是同一个事物内的两次查询,中间如果别人修改了查询内的记录且提交了,对第二次查询是不可见的,不会出现同条记录两次查询不一致问题。

● 幻读:就是一个事物内的两次查询,中间如果别人增加了记录并且提交了,第二次查询能查询到的,会出现和第一次记录不一致的现象。

 

事务的控制分很多个级别,级别的高低决定隔离的程度,MySQL中分四个级别:

● 读未提交:这种级别是最低的,A事务的修改没有提交对B事物是可见的,会出现数据的脏读,一般情况下不会用到此种类型。

● 读已提交:A事物的修改提交后才对B可见,这种情况会出现数据的幻读的问题,两次查询的结果不一样。

● 可重复读:是MySQL默认的级别,这种级别事物内的两次查询,中间其他修改了某条记录,对其他事务是不可见的,保证了重复查的情况下同条记录的一致性,但是对于新增的情况其他事务是可见的,所以还是会出现新增幻读的现象。

● 可串行化:事务之间是串行执行的,对查询到的每条记录都加锁,会出现阻塞的情况,并发情况下会造成严重的性能问题,所以一般也不会用到这种类型。

da42ae461bb3beb70330bc07a112817.png

隔离级别一览图

 

事务的隔离实现

事务当中的隔离是通过两种方式控制:一种是锁的方式,通过时间上的挫开达到隔离;另一种是版本控制的方式,记录多个版本达到隔离。

 

1、锁

MySQL当中的锁分读锁和写锁,读锁因为是读取数据所以可以多个同时读取同一份数据,具有共享性质;写锁涉及到数据的变动,所以和其他写锁和读锁是相冲突的,具有排他性质。

从锁的粒度上分表级锁和行级锁,表锁一般发生在对表结构的修改或对全表更新的时候,会阻塞所有对这张表的读写操作;行级锁一般发生在指定记录更新的时候,只会锁定指定记录。锁的粒度越小并发度越高,能优先行级锁尽量不要表锁,和程序中锁的粒度是一样的原则。

 

2、多版本并发控制

MySQL为了性能考虑除了行级锁以外还是另外一种方式,多版本并发控制,这中控制是由存储引擎实现。

书中说明了InnoDB一种简单的实现方式,这种方式是采用一条记录多个版本的方式,每条记录上增加了两个隐藏列,一个是创建版本号,一个是删除版本号,每开启一个事务都会分配一个事务版本号,事务版本号是递增的,事务内操作都会根据这个版本号比较。具体如下:

● 查询时:查询当前事务之前存在的记录和本事务创建的记录,且没有被删除的,即:创建版本号 当前版本号)

● 插入时:记录的创建版本号为当前事务版本号。

● 删除时:更新记录的删除版本号为当前事务版本号。

● 更新时:插入一条新记录,创建版本号为当前事务版本号,同时把原记录删除版本号改为当前事务版本号,代表已经删除。实际上这里的更新相当于删除再加一条记录。

 

3、乐观锁和悲观锁

锁从使用的角度又分悲观锁和乐观锁,悲观锁是持有很悲观的态度,认为我查到的数据都有可能被别人修改,所以查询的时候就把这一批数据锁起来,不让别人操作;乐观锁是持有很乐观的态度,认为我查到的数据基本不可能被别人修改,所以查询的时候不锁住这批数据,修改提交的时候再确认有没有被别人修改,有种亡羊补牢,为时不晚的意思。

 

乐观锁和悲观锁的实现:

● 悲观锁可以在数据库层面很简单的解决,利用select ... for update,在查询的时候就锁定这部分数据。

● 乐观锁的实现较悲观锁复杂,可以在数据库在一个版本号的列,更新的时候版本号都+1,以此来确认我查出来的数据后面有没有别人修改,已修改的不更新或程序抛一个异常。

 

使用乐观锁还是悲观锁:

从性能的角度考虑乐观锁性能更好,在查询到更新这段时间没有锁定操作,但是实现起来没有悲观锁简单,可能出错。所以要考虑的因素是系统的并发高不高?出现冲突的概率有多大?并发高的情况下选用乐观锁更好,反之选用悲观锁这种简单的方式更好。

推荐mysql视频教程,地址:https://www.php.cn/course/list/51.html

以上就是MySQL数据库事务的机制【总结】的详细内容,更多请关注其它相关文章!


# 的是  # 轴承网站建设都有什么  # 徐州网站推广公司价格  # 莆田定制网站建设  # seo音乐写作  # 哈尔滨关键词排名公司  # 玉溪网站seo  # 搜狗pc关键词排名工具  # 潜江湖南网站优化推广  # 美团怎么进行营销推广的  # 泉港区推广短视频营销平台  # MySQL  # 每条  # 中分  # 情况下  # 为我  # 是说  # 解锁  # 镜像  # 多个  # 两次 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 汽水音乐网页版登录 汽水音乐网页端官方入口  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  TikTok视频播放中断怎么办 TikTok播放异常修复方法  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  荣耀Magic7拍照夜景噪点处理_荣耀Magic7相机优化  J*aScript模块加载器_RequireJS原理分析  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  《异星探险家》古怪的物品作用介绍  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  苹果手机聊天记录删除了如何恢复  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  《搜书吧》阅读书籍方法  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  美发店速赢秘籍  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  word页码灰色不能用如何解决  React应用中Commerce.js数据加载与状态管理最佳实践  《偃武》甘宁技能详解  批改网网页版登录 批改网电脑版学生登录入口  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  胃动力不足?试试这5个调理方法  江苏大剧院会员卡购买步骤  企查查官网和爱企查 企查查企业查询官网入口  如何测试您的网站全球打开速度-网站海外测速工  《全民k歌》网页版最新登录入口一览  excel怎么计算平均值 excel平均函数*ERAGE使用教学  《海贝音乐》均衡器设置方法  如何在mysql中比较InnoDB和MyISAM区别  Google Cloud Functions 时区处理指南:理解与最佳实践  mysql怎么查询数据_mysql基础查询语句使用教程  《画加》约稿流程  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  附近酒吧怎么找?  小红书网页版首页入口 小红书网页版电脑端官方登录链接  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  c++如何掌握指针的核心用法_c++指针入门到精通指南  易车网官网直达入口 易车网在线登录入口  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  Excel宏怎么删除_Excel中删除宏的详细操作流程  Dagster资产间数据传递与用户配置管理教程  byrutor直接访问入口 byrutor官方游戏库  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  如何在CSS中设置背景图像:一个全面指南  PHP中实现JSON数据数组分页的教程 

 2020-03-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.