MySQL事务和锁——《MySQL DBA工作笔记》
MySQL事务
事务存在的原因
事务存在的目的:保证用户对数据操作对数据是安全的。(比如说银行卡余额)
事务的特性——ACID
原子性:一个事务要么全部执行,要么不执行
一致性:事务开始和结束时,数据保持一致
隔离性:事务之间互不影响
持久性:事务操作的结果具有持久性
关于脏读,不可重复读,幻读
脏读
事务A读取了事务B中尚未提交的数据。如果事务B回滚,则A读取使用了错误的数据。
【一个事物在读的时候,禁止读取未提交的事务】
不可重复读
不可重复读是指在一个事务范围内多次查询却返回了不同的数据值,这是由于存在查询间隔,被另一个事务修改并提交了。
【一个事物在读的时候,禁止任何事务写】
幻读
在事务A多次读取过程中,事务B对数据进行了新增操作,导致事务A多次读取的数据不一致。
【一个事物加上表级锁,禁止任何操作的并发】
小结:
脏读是读取了尚未提交的数据,不可重复读是读取了不停更新的数据(修改),幻读是指读取了不停更新的数据(新增)。
关于事务隔离级别
目的:避免脏读,不可重复读,幻读
读未提交:一个事务可以读到另一个事务尚未提交的数据。也就是脏读,避免脏读的方式:
读提交:一个事务要等另一个事务提交后才能读取数据。但会导致一个事务中相同查询出现不同的结果。也就是不可重复读。避免不可重复读的方式:
重复读(RR,MySQL默认级别):就是在开始读取数据时,不允许修改操作。但会导致由于允许insert操作导致的事务结果出现不同。也就是幻读,避免幻读的方式::
序列化:序列化使事务串行顺序执行,但会大大降低并发性能。
MySQL锁机制
Innodb实现了两种类型的行锁:共享锁,排他锁。
共享锁和排他锁
共享锁:允许一个事务读一行,阻止其他事务获得相同数据集的排他锁,多个共享锁是可以并行的。
排他锁:获取排他锁的事务允许更新数据,阻止其他事务获取相同数据集的共享锁和排他锁。
【复述一下】
假设事务A获取了表中的行666,就相当于获得了共享锁,此时A可以读取数据,其他事务也可以获得行666的共享锁,所以多个共享锁是可以并行指的是多个事务可以读取相同的行,但是一旦某行被获取了共享锁,就无法被其他事务获取排他锁,也就是说,行只能读,不能写。
然后A读完了,事务B要对行666进行更新操作,就需要先获得排他锁,获得排他锁之后,其他事务就无法获取行666的排他锁和共享锁,也就是说,在事务B更新数据的时候不允许其他事务读或者更新。
所以排他锁就是指只允许一个事务进行写操作,在这个过程中,不允许其他事务读,也不允许其他事务写。
也就是说,排他锁是串行的,不能被多个事务同时持有,但共享锁可以。
【如何使用行锁】
InnoDB行锁是通过索引上的索引项来实现的,InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!(这也是为什么需要进行索引优化的原因)
【行锁定的范围问题】
行锁:对索引项加锁,锁定一条记录
间隙锁:
编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想。
生活中排队的场景,小明,小红,小花三个人依次站成一排,此时,如何让新来的小刚不能站在小红旁边,这时候只要将小红和她前面的小明之间的空隙封锁,将小红和她后面的小花之间的空隙封锁,那么小刚就不能站到小红的旁边。
这里的小红,小明,小花,小刚就是数据库的一条条记录。
他们之间的空隙也就是间隙,而封锁他们之间距离的锁,叫做间隙锁。
间隙锁的目的是为了防止幻读
innodb自动使用间隙锁的条件:
- 必须在RR级别下
- 检索条件必须有索引(没有索引的话,mysql会全表扫描,那样会锁定整张表所有的记录,包括不存在的记录,此时其他事务不能修改不能删除不能添加)
Next-key Lock:等于行锁加间隙锁。扫描索引记录后,先对索引记录加上行锁,再对索引两边的间隙加上间隙锁。
意向共享锁和意向排他锁
Innodb虽然使用行锁,但并没有废弃表锁。
【行锁和表锁】
MyISAM存储引擎使用的是表锁,而Innodb增加了行锁。并不意味着Innodb彻底抛弃了表锁。
关于行锁,较小的粒度导致其高并发,但也因较小的粒度导致加锁慢,开销大,会出现死锁情况。
关于表锁,较大的粒度在高并发上的表现很弱,但同时粒度较大,加锁块,开销小,不会出现死锁情况。
没有完美的技术,只有合适的解决方案。在高并发场景下使用行锁而忍受一些问题本质上是一种权衡。
【意向锁的背景冲突】
意向锁的出现本质上是解决行锁和表锁矛盾的问题。
事务A获得了表中某一行的共享锁,事务B申请了表的写权限,这时候就会产生矛盾。
【关于意向锁】
首先,意向锁是一种表锁。
意向共享锁:事务获得表中的某一行的共享锁前,需要先获得整张表的意向共享锁。
意向排他锁:事务获得表中的某一行的排他锁前,需要先获得整张表的意向排他锁。
意向锁的加锁过程是自动完成的。
【意向锁的共享问题】
意向锁是表锁,它的互斥性是针对表级别的事务,比如一个事务要获取一张表的写权限。所以意向锁对于表级别的事务是互斥的。但是对于行级别的事务是共享的,也就是说,一个意向锁可以被多个行级别的事务所持有。
死锁
关于死锁抖音上有一个非常好玩的小视频:
面试官问:解释一下死锁,解释明白了就发offer
应聘者答:先发offer,发了offer再解释
死锁本质上就是持有锁和释放锁的问题,就像这个视频里描述的,面试官在听到死锁的解释后,才会释放offer这个锁,而应聘者是得到offer后才会释放死锁解释这个锁。offer和对死锁的解释就可以类比两个锁。
死锁的状态就是互相等待。
MySQL事务和锁——《MySQL DBA工作笔记》的更多相关文章
- MySQL事务与锁
MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...
- 关于mysql事务行锁for update实现写锁的功能
关于mysql事务行锁for update实现写锁的功能 读后感:用切面编程的理论来讲,数据库的锁对于业务来说是透明的.spring的事务管理代码,业务逻辑代码,表锁,应该是三个不同的设计层面. 在电 ...
- mysql事务和锁InnoDB
背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...
- MYSQL事务和锁
mysql事务(一)—转载 2012年12月20日 ⁄ Mysql数据库, 技术交流 ⁄ 暂无评论 一. 什么是事务 事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子) ,不可分割 ...
- mysql事务和锁InnoDB(转)
背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...
- MySQL 事务与锁机制
下表展示了本人安装的MariaDB(10.1.19,MySQL的分支)所支持的所有存储引擎概况,其中支持事务的有InnoDB.SEQUENCE,另外InnoDB还支持XA事务,MyISAM不支持事务. ...
- MySql 事务与锁
事务介绍 首先,什么是事务?事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子),不可分割,要么都执行,要么回滚(rollback)都不执行. MySQL 事务主要用于处理操作量大, ...
- Mysql事务及锁
一.事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:1.原子性(Atomicity):事务是一个原子操作单 ...
- MySQL入门详解(二)---mysql事务、锁、以及优化
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生很大的问题.而事 ...
- javaweb(三十八)——mysql事务和锁InnoDB(扩展)
MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就My ...
随机推荐
- BASE64Encoder cannot be resolved to a type类似问题的解决办法
我们有时候会碰见在JDK或者其他jar包中提供了某方法或者类,接口,而开发工具仍然报红,无法使用该类或者方法,那是应为我们的编译器没有识别,或者没有支持某些方法或者类 这个时候需要我们手动的开启.具体 ...
- ES6-字符串模板
es6字符串模板 // es5 let ananiah = "大诶呀"; let blog = "我要忘了你的样子"+ ananiah; console.log ...
- Python复习 一
Python回炉复习 1 变量 Python的变量和C语言的变量书写方式类似: 书写要求 python程序编写结构利用缩进表示,抛弃花括号: 结构 分支: if(条件语句1): 执行语句块 else ...
- Java中如何判断一个字符是否是字母或数字
使用Java中Character类的静态方法: Character.isDigit(char c) //判断字符c是否是数字字符,如‘1’,‘2’,是则返回true,否则返回false Chara ...
- 41-data-packed volume container
在上一节的例子中 volume container 的数据归根到底还是在 host 里,有没有办法将数据完全放到 volume container 中,同时又能与其他容器共享呢? 当然可以,通常我们称 ...
- TypeScript 学习笔记(四)
函数: 1.函数是一组一起执行一个任务的语句 2.我们可以把一段可复用的代码放到一起组成函数,从而提高效率 3.函数声明(通过关键字 function 来声明)告诉编译器函数的名称.返回类型和参数 4 ...
- Hive表的几种存储格式
Hive的文件存储格式: textFile textFile为默认格式 存储方式:行存储 缺点:磁盘开销大:数据解析开销大:压缩的text文件,hive无法进行合并和拆分 sequencefile 二 ...
- STM32F373(青风)+CUBEMX快速上手
STM32F373(青风)+CUBEMX快速上手 Created: Nov 23, 2019 7:43 PM Tags: CUBEMX,STM32 硬件熟悉 连接线 USB-TYPEB电源线一根,用于 ...
- 有static的方法和没有static的调用
package com.yh.test02; public class Test { public static void main(String[] args) { Test.method1(); ...
- RabbitMQ学习笔记(七、RabbitMQ实战)
目录: 削峰 分布式事务 削峰: 利用RabbitMQ队列消费特性避免峰值下的DB访问,缓解连接压力,在DB释放连接后再去消息数据. 分布式事务: )XA协议:它是一个分布式事务协议,由事务管理器和资 ...