`
aslijiasheng
  • 浏览: 57086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MYSQL 加锁 S 锁 X 锁 死锁 事务

阅读更多
由 InnoDB 预设是 Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行 Row lock (只锁住被选取的资料例) ,否则 MySQL 将会执行 Table Lock (将整个资料表单给锁住)。

举个例子:
假设有个表单 products ,裡面有 id 跟 name 二个栏位,id 是主键。
例1: (明确指定主键,并且有此笔资料,row lock)
    SELECT * FROM products WHERE id='3' FOR UPDATE;
例2: (明确指定主键,若查无此笔资料,无 lock)
    SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (无主键,table lock)
    SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主键不明确,table lock)
    SELECT * FROM products WHERE id<>'3' FOR UPDATE;  
例4: (主键不明确,table lock)
    SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
注1:
FOR UPDATE(X lock 不能读写) 或 lock in share mode(S lock 可读) 仅适用于 InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2:
要测试锁定的状况,可以利用 MySQL 的 Command Mode ,开二个视窗来做测试。
注3:
该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。
当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。

普通的select(没有加lock in share mode或for update)在MyISAM和InnoDB两种引擎下,都不会锁表锁行
对于MyISAM引擎,select语句加lock in share mode或for update是没有意义的,MyISAM必须用lock table来锁表操作
对于MyISAM引擎,update,insert语句会自动锁表
 
 
死锁  举个例子

首先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定:

mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;

Query OK, 0 rows affected (1.07 sec)

 

mysql> INSERT INTO t (i) VALUES(1);

Query OK, 1 row affected (0.09 sec)

 

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

 

mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;   S 锁定

+------+

| i    |

+------+

|    1 |

+------+

1 row in set (0.10 sec)

接着,客户端B开始一个事务并尝试从该表删除行:

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

 

mysql> DELETE FROM t WHERE i = 1;  阻塞中

删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列

最后,客户端A也试图从表中删除该行:

mysql> DELETE FROM t WHERE i = 1;

ERROR 1213 (40001): Deadlock found when trying to get lock;

try restarting transaction

因为客户端A需要一个X 锁定来删除该行,所以在这里发生死锁。尽管如此,锁定请求不被允许,因为客户端B已经有一个对X锁定的请求并且它正等待客户端A释放S锁定。因为客户端B之前对X 锁定的请求,被客户端A持有的S锁定也不能升级到X锁定。因此,InnoDB对客户端A产生一个错误,并且释放它的锁定。在那一点上,客户端B的锁定请求可以被许可,并且客户端B从表中删除行。 

 

所以  在客户端 B  最后 执行commit  是可以完成对 该行加 X 锁的 请求, 可以顺利删除,因为 客户端B 排队在先,所以客户端A 是不可以完成

对该行加X 锁!

 另外 一种 
当一个线程等待另外一个线程持有的锁,而后者正在等待第一个线程持有的锁时,就会发生死锁。
 

 

分享到:
评论

相关推荐

    MySQL之锁和事务

    目录一、锁分类死锁二、事务事务特性隔离级别多版本并发控制MVCC 一、锁 分类 Mysql为了解决并发、数据安全的问题,使用了锁机制。可以按照锁的粒度把数据库锁分为表级锁和行级锁。 表级锁 对当前操作的整张表加锁,...

    详解mysql 中的锁结构

    Mysql 支持3中锁结构 表级锁,开销小,加锁快,不会出现死锁,锁定的粒度大,冲突概率高,并发度最低 行级锁,开销小,加锁慢,会出现死锁,锁定粒度小,冲突概率最低,... 共享锁(s):允许一个事务去读一行,阻止其他事务获

    MySQL终级面试题,提升你的内力,给你面试助力

    1、MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。 ...4、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别

    MySQL死锁的产生原因以及解决方案

    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他

    最全MySQL面试60题和答案

    1.Mysql中有哪几种锁? 1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。...

    收集一些常见的 MySQL 死锁案例

    这个项目收集了一些常见的 MySQL 死锁案例,大多数案例都来源于网络,并对其进行分类汇总,试图通过死锁日志分析出每种死锁的原因,还原出死锁现场。 实际上,我们在定位死锁问题时,不仅应该对死锁日志进行分析,...

    最全mysql面试题-mysql-面试题

    1.Mysql中有哪几种锁? 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面...

    总结最近MySQL面试题大全

    1、MySQL 中有哪几种锁? 1、表级锁: 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高, 并发度最低。 2、行级锁: 开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低, ...

    Mysql面试题60个带答案

    #### 1.Mysql中有哪几种锁? 1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也...

    批量下载MySQL面试题 40道.pdf等

    共有 5 种类型的表格: 1 、 MyISAM2 、 Heap 3 、 Merge 4 、 I NNODB 5 、 MISAM 3 、 简述在 MySQL 数据库中 MyISAM 和 I nnoDB 的区别 MyISAM : 不支持事务, 但是每次查询都是原子的; 支持表级锁

    MySQL面试题26道

    1.MYSQL中有哪几种锁? 1、表级锁:开销小, 加锁快;不会出现死锁;锁定粒度大, 发生锁冲突的概率最高, 并发度最低。 2、行级锁:开销大, 加锁慢;会出现死锁;锁定粒度最小, 发生锁冲突的概率最低, 并发度也...

    MySQL锁机制与用法分析

    本文实例讲述了MySQL锁机制与用法。分享给大家供大家参考,具体如下: MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是...

    MySQL数据库面试题(50道题含答案和思维导图总结)

    1、MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。 (2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最 低,并发度...

    一次Mysql死锁排查过程的全纪录

    PS:本文不会介绍死锁的基本知识,mysql的加锁原理可以参考本文的参考资料提供的链接。 死锁起因 先介绍一下数据库和表情况,因为涉及到公司内部真是的数据,所以以下都做了模拟,不会影响具体的分析。 我们采用的是...

    细说MySQL死锁与日志二三事

    最近线上 MySQL 接连发生了几起数据异常,都是在凌晨爆发,由于业务场景属于典型的数据仓库型应用,白天压力较小无法复现。甚至有些异常还比较诡异,最后 root cause 分析颇费周折。那实际业务当中咱们如何能快速的...

    mysql数据库锁的产生原因及解决办法

    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他

    MySQL中InnoDB存储引擎的锁的基本使用教程

    MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 ...1、共享锁(S Lo

    MySQL的Innodb中的事务隔离级别和锁的关系

    这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。  #一次封锁or两段锁?  因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,是在...

    2019最新21个MySQL高频面试题介绍

    表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量 最低。 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。 2、Mysql支持事务吗? 在缺省模式下,...

    MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法...

Global site tag (gtag.js) - Google Analytics