mysql 事务,锁,隔离机制
mysql架构
锁
- 为了解并发问题,引入锁,mysql中锁分为读锁和写锁,即share lock和exclusive lock。故名思义,share lock之间不互斥,share lock和exclusive lock之间互斥,exclusive lock之间互斥。mysql 提供行锁row lock和表锁 table lock的multiple granularity locking。对于表锁,mysql提供一种意图锁的机制,意图锁也是分为两种,intention share lock和intention exclusive lock。对于intention lock
- Before a transaction can acquire a shared lock on a row in a table, it must first acquire an IS lock or stronger on the table.
- Before a transaction can acquire an exclusive lock on a row in a table, it must first acquire an IX lock on the table.
- Intention locks do not block anything except full table requests (for example, LOCK TABLES ... WRITE). The main purpose of intention locks is to show that someone is locking a row, or going to lock a row in the table
- intention lock之间并不互斥,intention lock只是告诉你有人对表中的某些行在上锁。
- mysql row lock是在存储引擎层实现的,不同的存储引擎可能有不同的实现方式
事务
- 事务是指一批操作,要么全部成功,要么全部失败。
- 数据库事务的ACID特性
- atomicity原子性:即一个事务已一个原子的操作执行,是一个不可分隔的最小单元,事务中的操作,要么全部执行成功,要么全部失败。
- consistency 一致性:数据库总是从一个一致的状态转移到另一个一致的状态
- isolation: 隔离性:一个事务中的修改,在什么时候对另一个事务可见
- durability: 持久性: 提交的事务不会丢失
- 隔离级别
- 隔离级别是对不同的事务而言的。
- read uncommitted:一个事务中未提交的修改也对另外的事务可见,在这里隔离级别下,会出现脏读,即事务1未提交的修改可能被别的事务可见。
- read committed: 一个事务提交commit后的修改才对另一个事务可见。但是可能会出现不可重复读的问题,即在一个事务1中,连续select两次,得到的结果不同,因为在这中间,可能记录被别的事务修改了。
- repeatable read:一个事务中,多次select的结果总是相同的,但可能出现幻读的情况,即虽然对于同一行的结果,始终是相同的,但可能别的事务在insert别的行,导致一个事务中间看到的记录是不同的。
- serializable:事务串行执行。
- 怎么解决不可重复读问题?在一个事务开始时,对涉及到的row加上行锁即可以保证另一个事务无法修改这一行。但是这解不了幻读的问题,因为别的事务可能insert的是别的行。这时候,需要引入gap lock。不仅锁这一个row,还锁这个row的前后间隙。具体怎么锁,根据查询条件是走唯一索引还是非唯一索引,是走等值匹配还是范围匹配有不同的gap lock lock的范围,但一个原则就是:保证你这个语句的查询范围内的数据不会被其他事务insert进去。
- 事务的两段锁:
- 在事务的执行过程中,随时可以进行锁定,但只有事务执行完毕commit或者rollBack的时候,才会释放锁。
MVCC 多版本并发控制
- 前面说锁分为读锁和写锁,这是一种悲观锁,MVCC是一种乐观锁,通过版本号控制,读副本的方式,来使得select读不用加锁,每次都读副本,同时保证读到的都是事务开始之前写入的数据。因为大多数数据库操作都是读多写少的,通过MVCC,读操作不用加锁,减少了锁冲突的概率,提高吞吐。select和事务又有啥关系呢?对于mysql,默认是auto-commit模式,如果不显示的开启一个事务,每个查询都被当作一个事务来执行。
- mvcc怎么实现的
- 每条记录后面增加两个version,创建version和删除version。
- 对于select语句,只筛选那些创建version小于等于事务version(保证查询到的记录在当前事务开始之前就已经存在了),且删除version在当前version之后的(保证记录在当前事务开始的时候,未被删除)
- insert 语句:插入新一行,创建version等于当前事务version
- update语句:新插入一行,创建version等于当前事务version,之前行的删除version设置为当前事务version
- delete语句: 当前行的删除version设置为当前事务version。
快照读和当前读
- select语句读的是快照,通过读快照,在RR级别也不会有幻读,对于select for update这种当前读,通过next-key lock解决幻读问题。
refer
- https://tech.meituan.com/2014/08/20/innodb-lock.html
- https://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads
- https://blog.csdn.net/qq_20597727/article/details/87308709
mysql 事务,锁,隔离机制的更多相关文章
- MySQL事务学习-->隔离级别
MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- mysql 事务锁超时时间 innodb_lock_wait_timeout
mysql 事务锁超时时间 innodb_lock_wait_timeout: # 查询全局等待事务锁超时时间 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait ...
- mysql数据库锁的机制-及事务事件
事务隔离级别,脏读.不可重复读.幻读,乐观锁.悲观锁(共享锁.排它锁) 数据库事务具有四个特征,分别是原子性(Atomicity).一致性(Consistency).隔离性(Isoation).持久性 ...
- MySQL事务以及隔离级别
前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...
- [转]MySQL事务学习-->隔离级别
From : http://blog.csdn.net/mchdba/article/details/12837427 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性 ...
- MySQL事务及隔离级别(读书小结)
标签: MySQL事务 隔离 0.什么是事务? 事务是指MySQL的一些操作看做是一个不可分割的执行单元.事务的特点是要么所有操作都执行成功,要么一个都不执行.也就是如果一个事务有操作执行失败,那么就 ...
- 面试官问你:MYSQL事务和隔离级别,该如何回答
一.事务 事务是由一组SQL语句组成的逻辑处理单元,是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚.事务具有以下4个属性,通常简称为事务 ...
- mysql数据库锁的机制-one
锁概念 : 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 举例 :以买火车票为例,火车票可面向广大消费者 ...
- MySQL——事务ACID&隔离级别
数据库事务ACID&隔离级别 什么是事务 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一 ...
随机推荐
- Windows进程间通讯(IPC)----管道
管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...
- redis 未授权访问(写公钥、写计划任务)
写公钥 ssh-keygen -t rsa # 生成key (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") & ...
- Dom树,什么是dom树?
相信很多初学前端的小伙伴,学了html,css,js之后,欣喜之余还有一丝小傲娇,没有想到那些大佬们口中又 提到了DOM树.你两眼一抹黑,年轻人总是要接受社会的爱(du)护(da). DOM 是 Do ...
- mac SSH私钥取消密码(passphrase)
取消私钥中的密码: 1.使用openssl命令去掉私钥的密码openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new 2.备份旧私钥mv ~/.ssh/ ...
- [Python] execl读写
相关库 读:xlrd 写:xlwt 案例 要求: 将图1中的数据导以图2的形式写入另一个文件中 第一列索引关系:{1:K1-B1,2:K1-B2} ...(18列) 思路: 按行读取数据,根据索引关系 ...
- 资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。
###### https://learn-linux.readthedocs.io/zh_CN/latest/administration/kernel/rlimit.html ########### ...
- Linux下Shell实现服务器IP监测
实验室有一个服务器放在机房,装的是Ubuntu Server,IP为自动分配,因此一旦IP有变化就无法远程操作,必须去机房记录新的IP.学了几天Shell之后想,是不是可以定时检测其IP的变化,一旦有 ...
- System Verilog设计例化和连接
- ASP.Net Core5.0 EF Core使用记录
打算把之前开源的 基于ASP.Net Core开发一套通用后台框架 重新用ASP.Net Core 5写一遍,也算是巩固一下旧知识,学习下新知识.本文是项目搭建初期关于 EF Core 的使用记录 1 ...
- supervisor 使 celery后台运行
1.安装 supervisor pip install supervisor 2.创建supervisor配置文件,命令如下: 进入项目文件 echo_supervisord_conf > s ...
