Mysql 插入意向锁与自增锁备份锁日志锁

插入意向锁Insert Intention Lock

插入意向锁Insert intention locks是记录级别的,它通过“INSERT”关键词来向其它的事务传达插入的意向。插入意向锁针对的是将要插入的记录而不是已经存在的记录。下面我们通过例子来重现这个插入意向锁。

示意案例

--Step1 在会话1里对city表ID大于4079的记录进行更新操作。

USE world;

START TRANSACTION;

SELECT * FROM city WHERE ID > 4079 FOR UPDATE;

--Step2 在会话2里 新起个事务并插入一条记录。

SELECT PS_CURRENT_THREAD_ID();

/*

PS_CURRENT_THREAD_ID()

50

*/

START TRANSACTION;

INSERT INTO world.city VALUES (4080, 'Darwin', 'AUS','Northern Territory', 146000);

--Step3 在会话3里查看插入意向锁的信息。这里的THREAD_ID来自Step2。

mysql> SELECT * FROM performance_schema.data_locks WHERE THREAD_ID = 50 \G

*************************** 1. row ***************************

ENGINE: INNODB

ENGINE_LOCK_ID: 140113210997976:1067:140113107561216

ENGINE_TRANSACTION_ID: 38669

THREAD_ID: 50

EVENT_ID: 75

OBJECT_SCHEMA: world

OBJECT_NAME: city

PARTITION_NAME: NULL

SUBPARTITION_NAME: NULL

INDEX_NAME: NULL

OBJECT_INSTANCE_BEGIN: 140113107561216

LOCK_TYPE: TABLE

LOCK_MODE: IX

LOCK_STATUS: GRANTED

LOCK_DATA: NULL

*************************** 2. row ***************************

ENGINE: INNODB

ENGINE_LOCK_ID: 140113210997976:6:35:1:140113107558304

ENGINE_TRANSACTION_ID: 38669

THREAD_ID: 50

EVENT_ID: 75

OBJECT_SCHEMA: world

OBJECT_NAME: city

PARTITION_NAME: NULL

SUBPARTITION_NAME: NULL

INDEX_NAME: PRIMARY

OBJECT_INSTANCE_BEGIN: 140113107558304

LOCK_TYPE: RECORD

LOCK_MODE: X,INSERT_INTENTION

LOCK_STATUS: WAITING

LOCK_DATA: supremum pseudo-record

2 rows in set (0.00 sec)

这时不难发现回话2即THREAD_ID为50的事务当前的锁模式为X,INSERT_INTENTION即排他的插入意向锁,这里看到锁定的数据是“supremum pseudo-record”即该表的上界伪记录。这里“X”对应next key锁,但这里比较特殊,因为锁的是上界伪记录,很显然是锁定不了的(上界无法定义),这里其实是个gap lock即锁定当前表的最后记录和上界伪记录之间的记录。

自增锁Auto-increment Lock

自增锁Auto-increment Locks主要应用在一个表有自增列时,确保两个事务对表操作时有不重复的唯一的值是很有必要的。如果使用基于语句的日志记录到二进制日志时,还有进一步的限制,因为在重放语句时,除了第一行以外的所有行都将重新创建自动递增值。Innodb通过参数innodb_autoinc_lock_mode设置自增锁。

0:traditonal (每次都会产生表锁,该自增锁是表锁级别,且必须等待当前SQL执行完成后或者回滚掉才会释放。)
1:consecutive (会产生一个轻量锁,无论是单一或者批量的insert SQL,可以立即获得该锁,并立即释放,能保证复制,但自增值不一定严格连续。)
2:interleaved (不会锁表,来一个处理一个,并发最高,所有insert种类的SQL都可以立马获得锁并释放,无法保证复制。)

备份锁Backup Lock

备份锁Backup Locks是mysql8.0里新引进的实例级别的锁,它主要是保证备份时数据库是一致的,它在备份时主要锁定以下语句:

CREATE TABLE、CREATE TABLESPACE、RENAME TABLE、DROP TABLE、 CREATE USER、 ALTER USER、DROP USER、GRANT等。

备份锁可以通过如下语句产生和收回,前提是用户拥有BACKUP_ADMIN权限:

LOCK INSTANCE FOR BACKUP

UNLOCK INSTANCE

示意案例

-- Step1 会话1里锁定数据库实例

LOCK INSTANCE FOR BACKUP;

-- Step2 会话2里优化world数据库里的city表

use world

OPTIMIZE TABLE city;

-- Step3 会话3里查看锁的相关信息(以mysql命令行方式执行)

SELECT * FROM performance_schema.metadata_locks

WHERE OBJECT_TYPE = 'BACKUP LOCK'\G

*************************** 1. row ***************************

OBJECT_TYPE: BACKUP LOCK

OBJECT_SCHEMA: NULL

OBJECT_NAME: NULL

COLUMN_NAME: NULL

OBJECT_INSTANCE_BEGIN: 4022252031312

LOCK_TYPE: SHARED

LOCK_DURATION: EXPLICIT

LOCK_STATUS: GRANTED

SOURCE: sql_backup_lock.cc:101

OWNER_THREAD_ID: 29

OWNER_EVENT_ID: 8

*************************** 2. row ***************************

OBJECT_TYPE: BACKUP LOCK

OBJECT_SCHEMA: NULL

OBJECT_NAME: NULL

COLUMN_NAME: NULL

OBJECT_INSTANCE_BEGIN: 2520403183328

LOCK_TYPE: INTENTION_EXCLUSIVE

LOCK_DURATION: TRANSACTION

LOCK_STATUS: PENDING

SOURCE: sql_base.cc:5400

OWNER_THREAD_ID: 30

OWNER_EVENT_ID: 19

2 rows in set (0.0007 sec)

-- Step4 解锁数据库实例

UNLOCK INSTANCE;

在如上的例子里,会话1里进程id 29拥有一个备份锁(back lock),而会话2里有个进程是30的在等待备份锁释放。这里LOCK INSTANCE FOR BACKUP是个共享锁,而DDL语句是排他的意向锁。

日志锁Log Lock

在创建备份时,通常需要包含与备份一致的日志位置信息,在Mysql 5.7时需要加一个全局读锁才能获取到这个信息,而在Mysql 8.0里InnoDB可以通过日志锁来读执行的全局事务标识(global transaction identifiers)又简称为GTIDs,二进制日志的位置、日志序列号(log sequence number 又简称为LSN)),而不再是读全局读锁。

日志锁Log Lock,可以阻止修改日志相关信息的操作。

示意案例

-- 查看日志状态。

SELECT *

FROM performance_schema.log_status\G

*************************** 1. row ***************************

SERVER_UUID: 59e3f95b-e0d6-11e8-94e8-ace2d35785be

LOCAL: {"gtid_executed": "59e3f95b-e0d6-11e8-94e8-

ace2d35785be:1-5343", "binary_log_file": "mysqlbin.

000033", "binary_log_position": 3874615}

REPLICATION: {"channels": []}

STORAGE_ENGINES: {"InnoDB": {"LSN": 7888992157, "LSN_checkpoint":

7888992157}}

Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock相关推荐

  1. Mysql 死锁过程及案例详解之用户自定义锁

    Mysql 用户自定义锁介绍 锁简介 当多个请求连接到数据库时,能保证同类查询执行时不相互冲突的机制即是锁.比如马路上的信号灯就是一个解决冲突的例子,在一定的时间内锁定了能通行的方向或者路线.MySQ ...

  2. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock

    记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...

  3. Mysql 死锁过程及案例详解之元数据锁MetaData Lock

    Mysql数据锁MetaData Lock 元数据锁MetaData Lock 元数据锁MetaData Locks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改. MetaDat ...

  4. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock

    显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...

  5. Mysql 死锁过程及案例详解之清空缓存锁Flush Lock

    Mysql 清空缓存锁Flush Lock 清空缓存锁Flush Locks flush table的功能是关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存. 这种操作需要用户拥有  ...

  6. wow mysql dbc_DBC中悲观锁介绍附案例详解

    DBC中悲观锁介绍附案例详解 了解下DBC中悲观锁: 代码如下: BDUtils 工具类: package JDBC; import java.sql.*; public class BDUtils ...

  7. mysql 自动截断_MySql中关于超长自动截断的案例详解

    这篇文章主要介绍了MySql超长自动截断实例详解的相关资料,这里通过实例来说明如何实现自动截断的功能,需要的朋友可以参考下 MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者 ...

  8. 数据湖架构Hudi(五)Hudi集成Flink案例详解

    五.Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址: https://archive.apache.org/dist/flink/ Hudi Supported ...

  9. 代码检查规则:Python语言案例详解

    在之前的文章中代码检查规则:Java语言案例详解学习了Java的检查规则.我们今天将学习<代码检查规则:Python语言案例详解>,内容主要分为两个部分:Python的代码检查规则和Pyt ...

最新文章

  1. 解决Windows对JDK默认版本切换问题
  2. ADB server didn't ACK
  3. swing程序中如何响应鼠标回车事件?
  4. 关于tensorflow和keras那些事儿
  5. 多线程-Task、await/async
  6. 如何解决With template button disable的问题
  7. Android之failed for task ‘:app:dexDebug‘致gradle编译OOM问题解决(android-support-multidex)
  8. Java基础——volatile关键字解析
  9. 接口的特点 java 1614101071
  10. go kegg_玩转GO和KEGG富集因子图的N种姿势: 3种数据处理(含在线筛选条目),3种排序方式,本地交互图片...
  11. oracle erase,c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
  12. xshell无法显示汉字
  13. video.js使用方法
  14. 基于matlab的基带gmsk调制解调,基于MATLAB的GMSK调制解调实验
  15. Transformer is All You Need: Multimodal Multitask Learning with a Unified Transformer
  16. 成为一名数据分析师,需要学习统计学吗?
  17. 早期微处理器相关的中文翻译书籍
  18. 容斥原理 A-1e9个兵临城下
  19. 机械臂规划----三次样条曲线
  20. GPRS模块 测试项目

热门文章

  1. VTK:柏拉图式固体用法实战
  2. JavaScript实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
  3. wxWidgets:wxStaticBox类用法
  4. wxWidgets:wxMessageOutput类用法
  5. wxWidgets:日期和时间
  6. boost::spirit模块实现任意元组的解析器的测试程序
  7. boost::hof::apply_eval用法的测试程序
  8. 使用 read_graphviz 将 GraphViz Dot 文本图加载到 BGL adjacency_list 图的简单示例
  9. boost::format模块异常处理的测试程序
  10. Boost::context模块fiber的stack测试程序