深入理解mysql锁与事务隔离级别
一、锁
1、锁的定义
2、锁的分类
- 从性能上分类:乐观锁和悲观锁
- 从数据库操作类型上分类:读锁和写锁
- 从操作粒度上分类:表锁和行锁
2.1 从性能上分类
2.1.1 乐观锁
2.1.1.1 版本号机制
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
update table set name = 'anna',version = version+1 where id = #{id} and version = #{version}
2.1.1.2 CAS算法
- 需要读写的内存位置V
- 进行比较的预期原值A
- 拟写入的新值B
2.1.2 悲观锁
- MYSQL的读锁、写锁、行锁等
- Java的synchronized关键字
2.2 从数据库操作类型上分类
2.2.1 读锁
2.2.2 写锁
2.3 从操作粒度上分类
2.3.1 表锁
2.3.2 行锁
二、事务
1、事务的定义
2、事务的特性
- 原子性:事务中所有操作应具有原子性,即要么都执行要么都不执行
- 一致性:指操作执行前后的数据具备一致性。这意味着,所有相关的数据规则都必须应用于事务的修改,以保证数据的完整性。事务结束时,所有的数据结构也都必须是正确的。
- 隔离性:每个事务都有其独立的环境,事务的的中间状态不为外界可见,反之亦然。
- 持久性:当事务提交之后,它对数据库数据的改变具有持久性,即便数据库宕机重启后数据库的数据状态应该依然是事务提交之后的结果。
3、并发事务处理带来的问题
- 更新丢失:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生更新丢失的问题-最后的更新覆盖的有其他事务所做的更新。
- 脏读:事务读取到了其他事务修改但未提交的的值,而之后那个事务进行了回滚,那么当前事务所读取到的数据就是脏数据,不符合事务的一致性。
- 不可重复读:当前事务在一开始读取了一行数据,而在那之后另一个事务提交了一个对于该行的更新,那么当此事务再次去读取同一行数据时,读取到的结果和第一次的不同、或则这一条记录已被删除,这种现象就叫做不可重复读。
也就是说事务读取到了其他事务已提交的数据,不符合隔离性。 - 幻读:事务A读取到了事务B已提交的新增的数据,不符合隔离性
4、事务的隔离级别
- 读未提交(read uncommit):可以读取到事务未提交的修改
- 读已提交(read commit):可以读取到事务已提交的修改
- 可重复读(repeatable read):事务进行中不会读取到其他事务已提交的修改,只会使用第一次查询时所获得的快照结果。这里使用到了MVCC(多版本并发控制)机制来达到这个效果。
- 串行化(Serializable):将事务转化为串行的形式来执行,该级别会进行锁表,因此不会出现幻读的情况,这种隔离界别的并发性极低,开发种很少会用到。

间隙锁:使用间隙锁可以在可重复读的隔离级别下避免幻读,使用下面SQL语句
update account set name = 'tufeu' where id>=5 and id < 7;
在事务开头执行这一语句,可以使得其他事务无法在当前事务未提交前在id为5到7之间插入数据,这就是间隙锁
当然如果你不想真的修改数据的话,请保证间隙锁范围内没有数据。


MVCC机制:
id name balacne create_id del_id
1 a 100 11
2 b 200 12 12
3 c 300 12
1 a 120 14
优化建议:
- 尽可能的让数据检索通过索引完成,避免无索引行锁升级为表锁
- 合理设计索引,尽量缩小锁的范围
- 极可能减少检索条件范围,避免间隙锁
- 尽量控制事务大小,减少锁定资源量和时间长度,设计事务加锁的sql尽量放在事务最后执行
- 尽可能使用低级别的事务隔离以提升并发效率
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
深入理解mysql锁与事务隔离级别的更多相关文章
- 【MySQL】深入理解MySQL锁和事务隔离级别
先看个小案例: 话不多说,上案例,先创建一个表 mysql> CREATE TABLE IF NOT EXISTS `account`( `id` INT UNSIGNED AUTO_INCRE ...
- 面试必问的MySQL锁与事务隔离级别
之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...
- MySql锁和事务隔离级别
在讲mysql事物隔离级别之前,我们先简单说说mysql的锁和事务. 一:数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去 ...
- 深入理解Mysql索与事务隔离级别
1. 概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...
- MySQL锁与事务隔离级别
一.概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.IO等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并发访 ...
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- mysql中不同事务隔离级别下数据的显示效果--转载
事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...
- 浅谈mysql中不同事务隔离级别下数据的显示效果
事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...
随机推荐
- sudo user1账号获得管理员root的权限
user1虽然有sudo权限,但不是真正的root权限,修改内核参数之类的就做不了 但是有sudo权限就可以添加账号,以下添加了admin账号与root账号一样的权限 useradd -u 0 - ...
- 2万字|30张图带你领略glibc内存管理精髓(因为OOM导致了上千万损失)
前言 大家好,我是雨乐. 5年前,在上家公司的时候,因为进程OOM造成了上千万的损失,当时用了一个月的时间来分析glibc源码,最终将问题彻底解决. 最近在逛知乎的时候,发现不少人有对malloc/f ...
- Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例
Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例 一位客户最近觉得觉得他的LED台灯好闪, 于是拆了看看,里面的控制板是这样的: 干掉双色调光功能,只调亮度的话闪烁的状况能好转 ...
- CLion 2021.2 debug报错 process exited with status -1 (attach failed (Not allowed to attach to process.
Clion 升级 2021.2 版本后 debug 报错: process exited with status -1 (attach failed (Not allowed to attach to ...
- 使用python操作HDF5文件
HDF Hierarchical Data Format,又称HDF5 在深度学习中,通常会使用巨量的数据或图片来训练网络.对于如此大的数据集,如果对于每张图片都单独从硬盘读取.预处理.之后再送入网络 ...
- Linux usb 1. 总线简介
文章目录 1. USB 发展历史 1.1 USB 1.0/2.0 1.2 USB 3.0 1.3 速度识别 1.4 OTG 1.5 phy 总线 1.6 传输编码方式 2. 总线拓扑 2.1 Devi ...
- 设计模式学习-使用go实现外观模式
外观模式 定义 适用范围 代码实现 优点 缺点 关于接口粒度的思考 参考 外观模式 定义 外观模式也叫门面模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接 ...
- [atAGC045B]01 Unbalanced
将0变为-1后求前缀和,那么$s$的价值即为最大的前缀和-最小的前缀和(特别的,空前缀的前缀和为0) 令$f(x)$表示当最大的前缀和不大于$x$时,最小的前缀和最大是多少,答案即为$\min_{x} ...
- [bzoj1105]石头花园
首先$C/2=x_{max}+y_{max}-x_{min}-y_{min}=max(x_{max},y_{max})-min(x_{min},y_{min})+min(x_{max},y_{max} ...
- dart系列之:在dart中使用生成器
目录 简介 两种返回类型的generator Stream的操作 总结 简介 ES6中在引入异步编程的同时,也引入了Generators,通过yield关键词来生成对应的数据.同样的dart也有yie ...