一:什么是锁?

  - 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。

  - 通俗的来说,锁是一种对资源的保护形式。

二:锁分类
  - 表级锁

    - 开销小,加锁快,没有死锁,锁定粒度大,发生锁冲突的概率最大,并发度最低

  - 行级锁
    - 提到了行锁,也就提到了并发控制。Innodb

    - 开销大,加锁慢,有死锁,锁定粒度小,发生锁冲突的概率最小,并发度最高

  - 页面锁
    - 介于表/锁之间。

三:如何加表锁?

  - 读锁
    - lock table 表名 read;

    - 对于读锁来说,不会堵塞读操作,但会堵塞写。

    - 

  

  -  写锁

    -  lock table 表名 write;

    -  对于写锁来说,会堵塞同表的读/写操作,在写操作时,他们是串行的

    - 

  

  -  释放线程占用锁

    -  unlock tables;

  

  - 注意

    -  使用 lock 语句执行的锁,不能 rollback回滚。

四:MyIsam 表锁相关

  - 谁来加锁

    - 在执行 SELECT 时, 会自动给表加上读锁

    - 在执行 UPDATE/DELETE/…..,则会自动上写锁

  

  - 为什么表锁不会有死锁

    - MyIsam 在加锁时候,会一次获取涉及表所有的锁

    - 如若是读锁,就不能写,如果是写,就不能读,这也就是MyIsam为什么不会有死锁的原因

  

  - 锁调度

    - 当一个进程处理写/一个进程处理读时,不分先后,总是写先得到锁,读等待

    - 因为 MyIsam 认为写操作是比读更重要的,这也就是MyIsam 不适合大量更新插入操作的原因

    - 同时,一些特别长时间的 读,也会使得 写 进程被 ‘饿死’

五:行锁加锁方式

  - 共享锁(S)

    - ......  lock in share mode;

    -  允许一个数据读取一行,阻止其他事务获得相同数据的排他锁

    -  当加共享锁之后要执行修改时,会自动的给该行数据加入排它锁

    - 

  - 排他锁(X)

    - ......  for update;

    -  允许获得排它锁的更新数据,阻止其他数据获得相同数据的共享锁和排它锁

    -  等于写锁,阻止其他事务读取和更新,等待锁的释放

    - 

   意向共享锁(IS)

    -  Innodb 自动加锁

    -  对于SELECT则不会加锁

   意向排它锁(IX)

    - Innodb 自动加锁

    - 对于(UPDATE/INSERT/DELETE) 会自动加上 排它锁(X)

  - 乐观锁

    - 乐观锁是一种思想,它其实并不是一种真正的『锁』

    - 乐观锁认为,在整个数据库执行过程中,是不会产生冲突的。

    - 它会先尝试对资源进行修改,在写回时判断资源是否进行了改变,如果没有发生改变就会写回,否则就会进行重试,在整个的执行过程中其实都没有对数据库进行加锁;

  

  - 悲观锁

    - 悲观锁认为,这个操作是有冲突的,必须在获得锁的情况下才能执行操作。

    - 悲观锁就是一种真正的锁了,它会在获取资源前对资源进行加锁,确保同一时刻只有有限的线程能够访问该资源。

    - 其他想要尝试获取资源的操作都会进入等待状态,直到该线程完成了对资源的操作并且释放了锁后,其他线程才能重新操作资源;

六:行锁实现方式

  -   Innodb 的行锁是根据索引来说实现的,也就是,是对索引的加锁

    -  也就是说,如果在不使用索引检索条件时,那么Innodb会对所有记录加锁,效果和表锁一样!

  -  对于使用范围查询的 < > 等,Innodb 也会在范围内(间隙)进行加锁,也就是所谓的 Next-Key 锁

七:产生死锁的原因

  - 原因

    - 当两个或两个以上的事务相互持有和请求锁的时候,如果形成一个循环的依赖关系,就会产生死锁。

    - 简单来说,就是两个开启的事务在相互等待对方释放出自己需要的锁,结果形成了一个依赖的关系,产生死锁。

    - 示例

    - 

八:减少锁冲突与死锁

  - 选用较低的隔离级别

  - 精心设计索引,尽量使用索引访问数据。使加锁更精确,避免锁冲突。

  - 选择合理的事务大小,小事务发生冲突的概率更小。

  - 显式加锁时,请一次请求足够级别的锁。

  - 在访问不同表时,请尽量按照一定顺序访问表。对一个表来说,按照顺序访问,会大大减少死锁概率。

  - 尽量使用 = 来查询数据,避免间隙锁对并发插入的影响。

  - 除非必须,否则查询时不要加锁。

  - 对一些特定的事务,加表锁有更好的效果。

九:锁相关

  - 当开启一个 start transaction; 也等于隐形执行了一次 unlock tables;

  -  在执行事务时,最好使用同一种存储引擎,因为 ROLLBACK/COMMIT 只能对同种引擎表做处理,如果不同,还需要对非事务表做特殊的处理.

  -  正常情况下,只有提交事务日志被记录到二进制文件中,但是由于存在非事务表,所以,回滚语句也会记录到二进制日志

《Mysql 锁》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Windows 下安装Git工具及基础使用

    Git简介 git是很好一个工具使用,可以执行liunx命令,有git环境后windows系统就可以进行shell命令操作,就可以添加其他liunx辅助软件进行执行,git也代码库管理工具,无论是上传 ...

  2. Apache JMeter压力测试实例

    脚本录制 脚本录制,JMeter启用WEB代理,浏览器把代理上网设置为JMeter所在的IP地址,自己电脑就是127.0.0.1代理端口默认8080.至于浏览器修改代理上网服务器,不做截图. Jmet ...

  3. webpack4 搭建遇到的奇葩问题集合

    一.webpack4 打包es6 会报错 需要安装一下插件 https://blog.csdn.net/Beamon__/article/details/85048448二.webpack4 打包动态 ...

  4. Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  5. 源码安装cx_Oracle(适合离线环境)

    cd ~/tools unzip instantclient-basic-linux.x64-12.2.0.1.0.zip mv instantclient_12_2 /opt/ export ORA ...

  6. 洛古P1036 选数 题解

    [我是传送门] 这是一道很经典的深搜与回溯(难度一般) 可是就这个"普及-" 让本蒟蒻做了一晚上+半个上午(实际我不会深搜回溯,全靠框架+去重); 下面让我分享下本蒟蒻的(全排列+ ...

  7. [模板][题解][Luogu1939]矩阵乘法加速递推(详解)

    题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^ ...

  8. Git服务器安装详解及安装遇到问题解决方案

    git是一个不错的版本管理的工具.现在自己在搞一个简单的应用程序开发,想使用git来进行管理.在Google了配置文档后,还是受了N多的挫折.某些文档质量不高,浪费了好多时间...... 好,切入正题 ...

  9. 廖雪峰Python3笔记

    主要复习过一遍 简介 略 安装 略 *** 第一个Python程序 第一行的注释: # _*_ coding: utf-8 _*_ #!/usr/bin/env python3 print() 可以接 ...

  10. 《javascript设计模式与开发实践》--- (单一职责原则)

    看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...