mysql 事务原理 mvcc_MySql事务以及MVCC机制与原理
事务
事务是一组原子性sql查询语句,被当作一个工作单元。若MySQL对改事务单元内的所有sql语句都正常的执行完,则事务操作视为成功,所有的sql语句才对数据生效,若sql中任意不能执行或出错则事务操作失败,所有对数据的操作则无效(通过回滚恢复数据)。
事务有四个属性原子性:事务被认为不可分的一个工作单元,要么全部正常执行,要么全部不执行。
一致性:事务操作对数据库总是从一种一致性的状态转换成另外一种一致性状态。
隔离性:一个事务的操作结果在内部一致,可见,而对除自己以外的事务是不可见的。
永久性:事务在未提交前数据一般情况下可以回滚恢复数据,一旦提交(commit)数据的改变则变成永久(当然用update肯定还能修改)。
多事务运行时的并发问题第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖;
脏读:一个事务读到另一个事务未提交的更新数据;
虚读:一个事务读到另一个事务已提交的新插入的数据;
不可重复读:一个事务读到另一个事务已提交的更新数据;
第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。
数据库锁
共享锁
用于读数据操作,他是非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新他。加锁条件:当一个事务执行select语句时。
解锁条件:默认情况下,数据读取后,数据库系统立即释放共享锁。
兼容性:放置共享锁后还可放置共享锁和更新锁。
并发性:具有良好的并发性能。当多个事务读取相同的数据时,每个事务都会获得一把共享锁,因此可以同时读锁定的数据。
独占锁
也叫排他锁,使用与修改数据的场合。他锁定的资源,其他事务不能进行读写。加锁条件:当一个事务执行insert,update,delete时,数据库系统会自动对被操作的数据使用独占锁。如果该数据已有其他锁存在,则不能放置独占锁。
解锁条件:事务结束。
兼容性:不和其他锁兼容。
并发性:并发性差,只允许有一个事务访问锁定数据。其他事务需等待,直到当前事务结束。
更新锁
更新操作的初始阶段用来锁定可以能要被修改资源的锁。更新锁可避免使用共享锁造成的死锁现象。加锁条件:当执行update时,数据库系统会先为事务分配一个更新锁。
解锁条件:当读取数据完毕,执行更新操作时,更新锁升级为独占锁。
兼容性:与共享锁兼容。一个资源可同时放置更新锁和共享锁,但只能放置一把更新锁。
并发性:允许多个事务同时读锁定的资源,但不允许其他事务修改。
读锁
也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁
又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
表锁
操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。
行级锁
操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。
MVCC
多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。
如何防止死锁合理安排表访问顺序;
使用短事务(包含尽可能少的能在短时间内完成操作的事务);将事务分解为多个小事务,让后分别执行。这样可保证每个小事务的快速完成,减少对数据资源锁定的时间;减少执行事务过程中等待需要更新的数据。
如果对数据要求不高,可以允许脏读。脏读不需要对数据资源加锁,可以避免锁冲突;
如果可能,错开多个事务访问相同数据资源的时间,防止锁冲突;
使用尽可能低的事务隔离级别。
数据库事务隔离级别Serializalble: 串行化。一个事务在执行过程完全看不到其他事务对数据库所做的更新。当两个事务同时访问相同数据时,第一个事务必须等第二个事务完成后才能访问。
Repeatable Read: 可重复读。事务在执行过程中可以看到其他事务已提交的新插入记录,但不能看到其他事务已提交的对已有记录的更新。
Read Committed: 读已提交数据。事务在执行过程中可以看到其他事务已提交的新插入记录,也可看到其他事务已提交的对已有记录的更新。
Read Uncommited: 读未提交数据。事务在执行过程既可以看到其他事务没有提交的新插入数据,也可看到其他事务已经提交的对已有记录的更新。
其中Serializalble的隔离级别最高,但并发性能最差。而Read Uncommited的隔离级别最低,但并发性能最好。隔离级别越高,越能保证数据的完整性和一致性,但并发性能则会降低。对于多数程序,可以优先考虑把数据库系统的隔离级别设置为Read Committed,它可以避免脏读,而且具有较好的并发性能。
mysql 事务原理 mvcc_MySql事务以及MVCC机制与原理相关推荐
- 【MySQL进阶-05】深入理解mvcc机制(详解)
MySql系列整体栏目 内容 链接地址 [一]深入理解mysql索引本质 https://blog.csdn.net/zhenghuishengq/article/details/121027025 ...
- MVCC 机制的原理及实现
什么是 MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL.Oracle.PostgreSQL 等)引擎 ...
- 【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制
什么是 MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL.Oracle.PostgreSQL 等)引擎 ...
- Mysql数据库事务:从未提交读—MVCC机制—Next-Key Lock,各种隔离级别及其解决对应问题的原理
为了更好地理清类似脏读.不可重复读.幻读,未提交读.提交读.可重复读.串行化等概念,必需有这样一个认识:即这些概念都是属于数据库四大特性之一--隔离级别下的内容.而所谓的"隔离", ...
- mysql引擎机制_关于MySQL中的InnoDB引擎的MVCC机制的理解
目前在阅读<High Performance MysqL Second Edition>,读到Multiversion Concurrency Control章节时对InnoDB实现MVC ...
- java for each 原理_Java for each实现机制代码原理解析
源测试代码如下 public class ForEachTest { public void test4Iterate(Iterable strings) { for (String str : st ...
- Mysql MVCC机制原理
目录 什么是MVCC Mysql的锁和事务隔离级别 Mysql的undo log MVCC的实现原理 什么是MVCC MVCC,全称Multi-Version Concurrency Control, ...
- mysql重复读导致余额不对_我所理解的MySQL之四:事务、隔离级别及MVCC
mysql教程栏目介绍MySQL相关的事务.隔离级别及MVCC. MySQL 系列的第四篇,主要内容是事务,包括事务 ACID 特性,隔离级别,脏读.不可重复读.幻读的理解以及多版本并发控制(MVCC ...
- 面试必备,MySQL InnoDB MVCC机制
MySQL InnoDB MVCC机制吐血总结 谈到MySQL事务,必然离不开InnoDB和MVCC机制,同时,MVCC也是数据库面试中的杀手问题,写这篇总结的目的,就是为了让自己加深映像,这样面试就 ...
最新文章
- 漫话:如何给女朋友解释什么是云计算?
- Angular系列学习二:基本的组件说明、自定义组件和部分细节说明
- opencv mat与avframe互转
- Debug docker: docker: Error response from daemon: could not select device driver ““ with capabilitie
- SpringBoot启动如何加载application.yml配置文件
- Android ServiceConnection
- 通过CMOS设置定时开机
- python学习(三)--跟着例子写的贴吧网页爬取
- JavaScript求两点之间相对于Y轴的顺时针旋转角度
- 用指针交换两个数_LeetCode双指针系列
- 浏览器加载渲染网页过程解析-总结
- layui select日期_layui给下拉框、按钮状态、时间赋初始值的方法
- adb shell 是这个啥东东
- 在Spring Boot中使用Spring Security实现权限控制
- 中国人工智能趋势报告(完整版)
- 【数字图像处理】(matlab入门1)
- python删除数组元素remove_python如何对数组删除元素
- 7-11 最长的单词
- linux 下的程序格式,linux 下软件安装包的格式有哪些?
- 使用JDBC操作数据库的六部曲
热门文章
- 2023合肥学院计算机考研信息汇总
- airflow error Flask-Appbuilder setp command
- 求解平稳分布matlab,随机过程课程设计--应用马尔科夫链的平稳分布预测空调市场的占有率.doc...
- CC2530定时器T1产生PWM
- 华为手机微信分身无法连接服务器,华为手机应用分身怎么使用?教你开启和关闭方法...
- 大数据是新的富矿 数据分析成为掘金关键
- 手把手教你申请IDEA终极版的许可证
- canvas 动画库 CreateJs 之 EaselJS(下篇)
- 网站建设中如何全面布局网站页面?
- 树莓派Linux基础(四):修改文件权限与从属关系