一:什么是锁?

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

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

二:锁分类
  - 表级锁

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

  - 行级锁
    - 提到了行锁,也就提到了并发控制。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. JS高级

    一.函数高级 1.函数回调 函数回调的本质:在一个函数中,满足特定条件下,调用另一个函数 // 回调的函数 function callback(data) {} // 逻辑函数 function fu ...

  2. H - 栀子花开

    这是一个栀子花开的季节,也是一个离别的季节,四年一千多个日日夜夜,那校园的角角落落,留下了我们沉思的身影:那上百次的成绩排名表,印证了我们深深浅浅不断进步的轨迹,但是这些进步都离不开老师的谆谆教诲. ...

  3. java----Maven

    下载地址 http://maven.apache.org/download.cgi 介绍 bin:运行脚本 windows 输入mvn可以运行这些脚本 boot:包含一个类加载器的框架,maven使用 ...

  4. TCP常见的定时器及三次握手与四次挥手

    1.TCP常见的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有七种定时器: 建立连接定时器(connecti ...

  5. ReSharper反编译C#类库

    经常会在使用C#类中的某个函数时想了解其中具体的代码,可是F12转到定义后只能看到函数简单的声明, 看不到方法体中的代码,这挺让人沮丧的.. 如下: F12进入后显示的是元数据, Equals函数只能 ...

  6. xilinx和altera的fpga的不同之处!----如果不知道,你将为之付出代价! --转载

    本人从2004年接触fpga开始,至今已经8年了.开发过altera的flex系列和cyclone3系列:开发过xilinx的vii和v5系列.下面谈谈本人对二者的一些不同,以便引起开发者对一些细节上 ...

  7. 在SOUI中使用线性布局

    SOUI 2.5.1.1开始支持线性布局(LinearLayout). 要在SOUI布局中使用线性布局, 需要在布局容器窗口里指定布局类型为vbox | hbox, (vbox为垂直线性布局, hbo ...

  8. 机器学习之--KNN算法简单实现

    # # kNN 分类算法 a = np.array([[1,1],[1.2,1.5],[0.3,0.4],[0.2,0.5]]) #构造样本数据 labels = ['A','A','B','B'] ...

  9. office图标(word,powerpoint,excel)异常(变成白板)问题修复

    都是wps搞的鬼. 如果先装了wps后卸载wps再装office就可能出现这个问题. 终于解决了!!先装个wps 2016,进入设置→高级→兼职性关联.这时你会发现ppt文件图标不是白板了.重启打开w ...

  10. CSS_细节总结

    1. 负外边距 上下200*200盒子的重叠,切记用 absolute 绝对定位 为最佳解决方案. 定位 position : fixed    absolute    relative( top 为 ...