MYSQL事务和INNODB下的锁机制
文章目录
- 一 什么是事务
- 二 事务四大特性
- 原子性
- 一致性
- 隔离性
- 持久性
- 三 事务四大隔离级别
- Read Uncommited(读未提交)
- Read Commited(读已提交)
- Repetable-Read(可重复读)
- SERIALIZABLE(可串行化)
- 四 为什么要有事务隔离级别
- 五 INNODB默认隔离级别
- 六 INNODB锁机制
- record lock
- gap lock
- next-key lock
一 什么是事务
想要真正了解事务,首先要知道什么是事务。常见例子就是转账,A转账给B一共2000元,这个操作其实有两步,第一步要从A的账户扣除2000元,第二步要给B的账号增加2000元,这两步操作合一,就成为了一个事务。那么事务有什么用,不难想象,在刚才的事务中,如果第一步操作成功后,银行系统崩溃,第二步没有成功,岂不出大事了。从这个例子可以看出,事务就是保证这两个关键操作要么都成功,要么都失败。
二 事务四大特性
从以上的例子和事务的功能来看,很容易就可以归纳出一些特性,例如操作必须都成功或者都失败,操作前后必须保证数据库的数据一致,不同事务不可以互相影响,操作完之后变化的数据应当被保存以防系统崩溃,那么因此可以归纳出以下四个特性:
原子性
- 这个特性如其名字一样好理解,事务是不可被分割的最小单位,事务中的操作要么全被执行,要么全部失败
一致性
- 事务执行前后除非修改了数据,否则数据应保持一致,多个事务对相同数据读取的内容也应该一致
隔离性
- 试想你在进行转账时,别人的转账操作也会改变你的账户余额你怕不怕 ,因此我们要确保事务之间不能相互影响
持久性
- 如果你进行完转账之后,银行系统崩溃,但你转账的操作没有被保存,系统恢复后无法查到你转账的记录,你上不上火。所以就需要持久性,事务执行后数据应当被保存,即使系统崩溃,您的操作也不会丢失。
三 事务四大隔离级别
Read Uncommited(读未提交)
- 如其名,允许事务中读取其余事务尚未提交的操作,因此会带来脏读问题
- 所谓脏读,举个例子,有人想和对象分手,写了一封分手信,左思又想还是不分了,分手信被撕掉了,他不想让任何人知道,也不会分手。但是他写信的时候,偏偏有个杀千刀记者也在他身边,那人读到他分手信,并且把这件事记录下来登了报,事情瞬间大发,他被迫分手了。这就是脏读,读到了别人尚未提交的操作。
Read Commited(读已提交)
- 如其名,只允许事务读取已提交的操作,脏读问题不在了,但是有可能会产生不可重复读 和幻读
- 所谓不可重复读,举个例子, 你和对象逛街,把钱包留给她去上了个厕所,去之前看了一下钱包,里面还有1000元,上完厕所回来再看一下钱包,只剩两毛,短短3分钟读到两个完全不一样的数据,就是不可重复读。
- 所谓幻读:你去上完厕所回来之后,钱一分没少,还多了个钱包,你看着你对象笑呵呵的脸,是不是跟幻觉一样,其实是她自掏腰包给你又买了一个,这就是幻读。
Repetable-Read(可重复读)
- 如其名,可以重复读,重复读啥呢,实际上它解决了不可重复读的问题,不可重复读的问题不就是你上厕所前后读到的钱包里的钱不一样嘛,那怎么保持一样呢,把钱包锁起来,保准你的钱不会少。但仍有可能幻读,为什么呢?因为你把钱包锁起来,你对象还是可以自掏腰包给你买个新的,回来之后,啪!跟幻觉一样,这种幻觉感还可能因为你对对象的不信任加强,是不是这个道理。
SERIALIZABLE(可串行化)
- 最高的隔离级别,完全严格遵从ACID特性,事务之间互不干扰,逐个执行,这样可以解决脏读,不可重复读,幻读。
- 例如上面你去上厕所前,叮嘱你对象上厕所的时候啥也别干,都等到你回来再做,那就不会出现惊喜了吧。
四 为什么要有事务隔离级别
之所以要有事务隔离级别,是因为根据不同的业务场景,我们需要避免脏读,幻读,不可重复读的情况不太一样,说白了,还是跟你要实现的业务有关系。例如,你是个大款,带对象逛街,你就不会在乎回来之后钱包里钱和之前不一样了,所以不用解决不可重复读。再比如你是女生,你不希望男生给你破费,所以你去上厕所得时候就得想办法解决你男朋友等会再给你买只口红的问题,也就是解决幻读问题,所以隔离级别是为了不同业务划分的。
五 INNODB默认隔离级别
INNODB引擎默认使用的RR隔离级别,和默认的RR隔离级别不同,INNODB的RR通过next-key lock解决了幻读问题,实现了事务的隔离性,所以INNODB中的RR隔离级别实际上他达到了SQL标准的SERIALIZABLE隔离级别。而隔离级别越高,申请的锁越多,因此大部分引擎都选择RC隔离级别,但INNODB的RR隔离级别不仅效果好,而且并没有引起性能损失,可谓强中强
六 INNODB锁机制
那为什么INNODB中RR隔离级别那么强?这就不得不说一说它用到的锁算法
record lock
锁一条记录本身
gap lock
next-key lock
锁一个范围,包含记录本身(就是record lock + gap lock)
如上,INNODB对于行的查询用了next-key lock,但是如果你查的结果只有唯一属性(例如where…),就会降级到record锁。
MYSQL事务和INNODB下的锁机制相关推荐
- mysql不可重复读是锁的表吗,Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)...
. 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5000,汇入100,并提交数据库,工资变为5100, 随后 事务A发生异常,回滚了,恢复张三的工资为5000,这样就导致 ...
- Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...
- MySQL事务原理之MVCC和锁机制
MVCC和锁 一.MVCC 1.1.read view 1.2.聚集索引的隐藏列 1.3.事务的可见性问题 1.5.快照读 1.6.当前读 二.redolog 三.undolog 四.锁 机制 4.1 ...
- mysql 并发_Mysql事务,并发问题,锁机制
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...
- mysql不可重复读是锁的表吗_Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)...
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...
- MySQL 与InnoDB 下的锁做朋友 (二)共享锁与排他锁
前言 没有前言,我们直接看内容. 正文 共享锁(Shared Lock) 共享锁.S锁.读锁 ,都是他的叫法. 而我,喜欢叫他 共享读锁 . A shared (S) lock permits t ...
- mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法
数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 ...
- 带你了解什么是MySQL数据库(八)数据库锁机制
目录 数据库的锁机制 锁的分类 MySQL中的行级锁,表级锁,页级锁(粒度) 行级锁之共享锁与排他锁(级别) innodb存储引擎的锁机制 行级锁与表级锁区分 三种行锁算法 死锁问题 什么时候使用表锁 ...
- MySQL存储引擎,索引,锁机制
一,MySQL存储引擎 介绍: MySQL数据库使用不同的机制存取表文件,包括存储方式,索引技巧,锁定水平等不同的功能,这些不同的技术以及配套的功能称为索引引擎 Oracle,Sqlserver等数据 ...
最新文章
- 学精算的计算机知识,精算学专业学什么 附学习科目和课程
- having 与where 的异同点
- TreeView的异步延时加载
- docker 保存 环境持久化_18、docker的持久化存储和数据共享
- 报错:TypeError: can‘t pickle _thread.RLock objects
- php项目数据库控制器代码_如何为大型代码库组织Express控制器
- java 使用apollo,Springboot apollo原理及使用方法详解
- xp等系统的登陆的密码清除方法
- lintcode:1-10题
- bim 水利枢纽 运维_BIM——运维专篇
- vue生成静态html文件_Vue项目打包成一个HTML文件(包含CSS,JS)
- 风险模型—CreditMetrics模型1
- 最近弄魔窗SDK踩过的坑
- 计算机连接打印机连接打印机,怎么连接打印机.教您怎么连接打印机
- [小说]魔王冢(35)天目
- 怎样制作gif格式动图?如何在线自制gif动图?
- 京东零售大数据云原生架构实践
- 动手写一个HTML5的无限循环滚动焦点图
- UVA 1626括号序列DP
- 时隔多年,我胡汉三又回来了
热门文章
- 动态规划-青蛙跳台阶
- 【爬虫】403 Forbidden报错的解决办法
- 冲上热搜!华为30岁以下员工仅占28%
- flowable+springboot 实现工作流审批 全局变量流转,动态设置审批人 组审批
- Ae 案例:制作粒子空间穿梭动画
- 有合并单元格时的排序问题
- Java学习总结-持续更新
- 在潛移默化里··········
- 阳光城:规模快车道上的速度与理性
- 直流无刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)