`
aslijiasheng
  • 浏览: 58383 次
  • 性别: 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加锁处理分析@何登成1

    本节将对死锁原理和分析进行了详细的解释,死锁是 MySQL 加锁机制中的一种常见问题。 八、总结 本文对 MySQL 加锁处理进行了深入分析和讨论,对读者理解 MySQL 加锁机制的工作原理和实现方式有很大的帮助。

    阿里大牛何sir 深入MySQL加锁处理分析

    在InnoDB存储引擎中,锁分为共享锁(S锁)和排它锁(X锁)。共享锁允许多个事务同时读取同一数据,但是不允许修改。排它锁则允许事务对数据进行读取和修改,其他事务不能同时读取或修改同一数据。 隔离级别...

    mysql加锁分析

    ### MySQL加锁分析 #### 背景 MySQL/InnoDB的加锁机制一直是数据库管理领域的一个难点。在日常工作中,经常会遇到与之相关的疑问,尤其是关于如何避免或解决死锁的问题。本篇文章旨在深入剖析MySQL/InnoDB的加锁...

    何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道

    InnoDB的锁模式包括共享锁(S)和排它锁(X)。共享锁允许多个事务同时读取同一个资源,而排它锁则不允许其他事务读取或写入锁定的资源。除此之外,InnoDB还存在一些特殊的锁模式,例如插入意向锁(LOCK_INSERT_...

    MySQL DELETE 删除语句加锁分析1

    在MySQL中,DELETE语句的加锁行为是数据库事务处理的重要组成部分,尤其是在并发环境中,正确理解其加锁机制对于避免死锁和提高系统性能至关重要。本篇文章主要探讨了在不同隔离级别下,针对不同索引类型的DELETE...

    mysql加锁分析_v1

    2. **判断加锁类型**:如果是当前读,进一步判断加锁类型是共享锁(S锁)还是排他锁(X锁)。 3. **分析锁的影响范围**:考虑锁的范围,比如是在单个记录、索引还是表级别。 4. **评估潜在风险**:分析加锁可能带来...

    MySQL 加锁处理分析1

    MySQL/InnoDB的加锁分析是数据库管理中的一个重要话题,因为正确理解加锁机制对于优化查询性能和避免死锁至关重要。本文主要探讨了MySQL/InnoDB存储引擎中的锁机制,特别是MVCC(多版本并发控制)以及不同类型的读写...

    何登成的技术博客 » MySQL 加锁处理分析1

    MySQL通过死锁检测机制来检测并解决死锁,当检测到死锁时,会回滚其中一个事务,让其他事务得以继续执行。 总结来说,理解MySQL的加锁处理对于优化并发性能和避免死锁至关重要。通过深入分析SQL语句的加锁行为、...

    4.5 mysql 加锁分析.pdf

    4. **锁模式**:共享锁(S锁)允许多个事务同时读取数据,而排他锁(X锁)则禁止其他事务对加锁的数据进行任何操作。 #### 七、总结 通过对MySQL/InnoDB加锁机制的深入探讨,我们不仅了解了其背后的原理和技术细节...

    mysql死锁分析

    对于像MySQL这样的关系型数据库,掌握正确的加锁策略、事务设计以及锁等待超时设置等知识,是确保系统稳定运行的关键。 在本案例中,我们不仅学习了如何阅读和理解死锁日志,更重要的是了解了死锁发生的具体原因...

    【课堂笔记】MySQL事务与锁详解.pdf

    MySQL事务与锁详解的知识点如下: 1. 事务的理解与应用场景: 事务是数据库管理系统(DBMS)执行过程中的逻辑单位,是一个不可分割的工作单元,可以包含一条或多条DML语句。在实际应用中,事务常见的使用场景包括:当...

    mysql死锁解决

    在MySQL中,尤其是在InnoDB存储引擎下,当检测到死锁时,MySQL会自动选择回滚其中一个事务来解除死锁状态。 #### 二、死锁产生的原因 1. **循环等待**:多个事务之间存在循环的资源等待关系。 2. **互斥条件**:...

    MySQL:锁机制.pdf

    锁机制是数据库管理系统中用来确保数据并发访问一致性、有效性和完整性的关键技术。...对于可能出现的锁争用和性能瓶颈,通过查看相关的状态变量和日志信息来进行优化,同时要避免死锁的发生,确保系统的稳定运行。

    记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理.doc

    在死锁发生时,两个事务都在尝试插入新用户,每个事务都在其各自的ID上加锁,但由于ID不存在,实际加的是范围锁。当一个事务尝试获取另一个事务已经持有的锁时,就会发生死锁。 在MySQL的InnoDB存储引擎中,如果...

    MySQL之锁和事务

    其他事务可以再对数据加S锁,但不能加X锁,直到原事务释放S锁。 2. **排他锁(X)**:又称写锁,允许事务读取和修改数据,不允许其他事务加任何类型的锁,直到事务结束释放锁。 3. **意向锁**:在InnoDB中,为了...

    mysql事务与锁机制(存储引擎和锁、MyISAM锁机制、InnoDB锁机制、Next-Key锁、Dead-Lock).docx

    - **排它锁(X锁)**:阻止其他事务获取任何类型的锁。用于写操作,保证数据在修改过程中不被其他事务读取或修改。 - **意向锁**:意向锁是事务在获取表中的行级锁之前先获取的一种锁类型。意向锁分为意向共享锁(IS)...

    大牛出手MySQL死锁深入分析

    死锁日志会显示参与死锁的各个事务及其持有的锁和等待的锁信息。通过分析这些日志,可以了解每个事务所持有的锁类型和状态。例如,事务可能持有表级意向锁和行级锁,等待状态可能表示需要获得其他事务持有的锁。...

    MYSQL锁机制

    InnoDB是MySQL中最常用的事务型存储引擎,它支持行级锁和表级锁,但在默认情况下使用行级锁。 ##### InnoDB行级锁的特点 - **高并发**:由于锁定的范围较小,可以更好地支持并发操作。 - **死锁检测**:InnoDB具有...

Global site tag (gtag.js) - Google Analytics