一、Latch & Lock

在数据库中 Latch & Lock 都可以被称为锁,但两者有着截然不同的意义。

Latch 一般被称为闩锁(轻量级的锁),锁定的时间很短,若持续的时间长,则应用的性能会非常差。

在 InnoDB 中 Latch 锁又可以分为 mutex (互斥量) 和 rwlock (读写锁)。其主要目的是用来保证并发线程操作临界资源的正确性,并且没有死锁检测机制。

## Latch 是一个非常透明的东西,一般除了非常底层的数据库人员很难看懂

## show engine innodb mutex;

Lock 的对象是事务,用来锁定的数据库中的对象,如表,页,行。一般 Lock 的对象仅在事务 commit 或rollback 后进行释放(不同事务隔离级别释放的时间可能不同)。Lock 与 Latch 不同的是 Lock 有死锁检测机制的。

二、InnoDB 存储引擎中的锁

一、InnoDB 存储引擎中的锁:

S 行级共享锁:允许事务读一行数据;lock in share mode。

X 行级排他锁 :  允许事务更新或删除一行数据;增删改产生排它锁,还有一个比较特殊 select ... for update。

IS : 意向锁

IX : 意向排他锁

AI : 自增锁,AI 自增锁 ,自增锁是用来做自增的并发控制的。

二、锁之间的兼容性

锁兼容(Lock Compatible): 如果事务T1 获得行 r 的共享锁,那么另外的事务 T2 可以立即获得行 r 的共享锁,因为读取并没有改变行 r 的数据。

锁不兼容: 若有其他的事务 T3 想获得行 r 的排他锁,则必须等待事务 T1、T2 释放行 r 上的共享锁。

表 1-1 排它锁和共享锁的兼容性

从表1-1 可以看出 ,X锁与任何的锁都不兼容,而 S 锁仅和 S 锁兼容。S 锁 和 X 锁都是行锁 ,兼容是指对同一记录(row)锁的兼容情况。

意向锁: 用来实现多粒度级别的锁的。

揭示下一层级请求的锁类型。

IS : 事务想要获得一张表中某几行的共享锁

IX : 事务想要获得一张表中某几行的排它锁

InnoDB 中意向锁都是表锁(简单的这样理解下)

数据库总共有表锁,页锁,记录锁,但是在 MySQL 中只有表锁跟记录锁,意向锁都是加在表上的。

意向锁之间都是兼容的,用来揭示下一层级的锁。

表 1-2 InnoDB 存储引擎中锁的兼容性

三、查看锁对象内容

使用 show engine innodb status

(root@localhost) [(none)]> pager less

PAGER set to ‘less‘

(root@localhost) [(none)]>

(root@localhost) [(none)]> show engine innodb status \G

TRANSACTIONS

------------

如果想查看比较详细的锁的信息,可通过开启 innodb_status_output_locks

(root@localhost) [test]> set global innodb_status_output_locks=1;

Query OK,0 rows affected (0.00sec)

(root@localhost) [test]> show variables like ‘%innodb_status_output%‘;+----------------------------+-------+

| Variable_name | Value |

+----------------------------+-------+

| innodb_status_output | OFF |

| innodb_status_output_locks | ON |

+----------------------------+-------+

2 rows in set (0.00 sec)

如下是开启 innodb_status_output ,show engine innodb status 输出的详细信息:

找到 TRANSACTIONS , heap_no 2,3,4 表示的是插入的顺序,其中包含两个隐藏列, len 6 是指针列,len 7 是什么列来着忘了

在 show engine innodb status 中的 thread_id 对应的是 show processlist 中 processlist_id 。

这样看有点麻烦,可以借助 information_schema 中的几张表,innodb_trx,innodb_locks,innodb_lock_waits

在 5.7 版本中有一张 innodb_lock_waits

(root@localhost) [sys]> select * frominnodb_lock_waits\G*************************** 1. row ***************************wait_started:2019-02-28 16:26:18wait_age:00:00:18wait_age_secs:18locked_table: `test`.`lock_1`

locked_index:PRIMARYlocked_type: RECORD

waiting_trx_id:260217waiting_trx_started:2019-02-28 16:26:18waiting_trx_age:00:00:18waiting_trx_rows_locked:1waiting_trx_rows_modified:0waiting_pid:18waiting_query:update lock_1 set b=6 where a=4waiting_lock_id:260217:217:3:3waiting_lock_mode: X

blocking_trx_id:260213blocking_pid:19blocking_query:NULLblocking_lock_id:260213:217:3:3blocking_lock_mode: X

blocking_trx_started:2019-02-28 16:11:46blocking_trx_age:00:14:50blocking_trx_rows_locked:1blocking_trx_rows_modified:0sql_kill_blocking_query:KILL QUERY 19sql_kill_blocking_connection:KILL 19

1 row in set, 3 warnings (0.00 sec)

# kill query :表示杀掉查询,

# kill 表示这个连接也杀掉

四、AI 自增锁

MySQL 的自增存在一个回溯问题,简单说 MySQL 的自增是不持久化的。当数据库被异常重启 可以通过 select max(auto_inc_col)from t for update;

重新获得表的自增起始id 值,这个可能会造成 id 冲突。

自增锁在提交完成之后就已经被释放了。所以自增锁持有的时间是SQL的执行时间。假如你插入的是一个大事务的话就会出现阻塞了。

而x,ix 等是需要commit 之后才能释放的。

设置 innodb_autoinc_lock_mode=2 // 每一条记录加锁释放,这个提高了并发能力,但是可能出现一条语句中的数据不连续了。

mysql mutex_MySQL 有关锁的简单介绍相关推荐

  1. mysql非关锁_MySQL 有关锁的简单介绍

    ) [test]> set global innodb_status_output_locks=1; Query OK,0 rows affected (0.00sec) (root@local ...

  2. 关于几种分布式锁的简单介绍

    什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁.进程锁. 1.线程锁 主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同 ...

  3. Derby与mysql的关系_Derby数据库简单介绍和使用方法 | 学步园

    一. Derby 数据库介绍 Apache Derby 是100% Java 编写的内存数据库,属于 Apache 的一个开源项目.并且是一个容易管理的关系数据库管理系统,可以和一些商业产品的特性进行 ...

  4. MySQL下备份和恢复简单介绍

    为什么要备份?     由于使用MySQL时自己的一些误操作导致数据丢失或者是开发写程序时删除了不该删的数据,我们知道企业中数据是最重要的,那么此时为了数据的安全性,我们就必须的提前把数据给备份好,万 ...

  5. MySQL DELETE 语句的一个简单介绍

    MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令. 语法 ...

  6. mysql锁在粒度上分为_mysql锁的简单理解

    一.锁 我们通常概念里的锁,是用来处理线程安全问题,锁(latch)的对象是线程,而在mysql中通常所说的锁(lock),是用来实现事务的acid特性的一种手段,也就是锁(lock)的对象是事务,而 ...

  7. MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍

    MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性 ...

  8. [第11天]mySQL简单介绍

    昨天我们说到了SQL,很多朋友说很难,我也知道很难的,说那个只是让大家有个基本的了解,不然以后说一些问题时会很困难的.今天我们来说mySQL,之所以说它是为了让大家对数据库能有个较深的了解.MySQL ...

  9. mysql行级锁 表级锁 页级锁详细介绍_MySQL行级锁、表级锁、页级锁详细介绍

    页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...

  10. 详细介绍MySQL/MariaDB的锁

    官方手册:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-transaction-model.html 1.事务提交的方式 在MariaD ...

最新文章

  1. rocketmq 重复消费_RocketMQ的十二个特性,你都知道吗「下」
  2. 一个浙江商人立下的22条规矩
  3. 【Spring Boot】1.基础知识
  4. 视频API的发展方向
  5. python数据结构与算法
  6. ubuntu安装配置方法【转】
  7. java asm源码分析_探究CAS原理(基于JAVA8源码分析)
  8. C++落选,2021年最想学习的五大编程语言
  9. mybatis使用char类型字段查询oracle数据库时结果查询不到的问题
  10. jquery显示与隐藏效果
  11. 使用Spring Boot日志框架在已有的微服务代码中添加日志功能
  12. 在GridView列中动态创建几个CheckBox
  13. meta分析学习分享
  14. 新手向python实现淘宝自动抢购
  15. 要闻君说:华为“发飙”了;快手抛出了1000+社招岗位;迅雷2018年度财报:云连续三年上涨;定论!小米成立AIoT战略委员会...
  16. 如何破解光猫,获取超级管理员账户和密码
  17. [生存志] 第55节 吴公子札巡访中原
  18. html实现密码手机找回,找回密码.html
  19. 嵌入式Linux驱动开发9---WTD驱动程序以及测试过程记录
  20. Pytorch的model.train() model.eval() torch.no_grad() 为什么测试的时候不调用loss.backward()计算梯度还要关闭梯度

热门文章

  1. android 控件获取 获取焦点
  2. Oracle database 11g release2发布
  3. springmvc源码-我们自定义的参数解析器是如何放入到spring容器中的
  4. SpringMVC中Model,ModelAndView,ModelMap的区别
  5. c# 循环com,分别对串口写入与读取,获取需要的串口信息
  6. MaxCompute/DataWorks权限问题排查建议
  7. layui监听多个radio事件
  8. iOS边练边学--(Quartz2D)图片裁剪,带圆环的裁剪
  9. AutoLearnSkills.lua --升级自动学习技能
  10. Exchange Server 2013系列十二:邮箱的基本管理