举个例子:
FOR UPDATE(X lock 不能读写) 或 lock in share mode(S lock 可读) 仅适用于 InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
要测试锁定的状况,可以利用 MySQL 的 Command Mode ,开二个视窗来做测试。
该语句用来锁定特定的行(如果有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 加锁机制中的一种常见问题。 八、总结 本文对 MySQL 加锁处理进行了深入分析和讨论,对读者理解 MySQL 加锁机制的工作原理和实现方式有很大的帮助。
在InnoDB存储引擎中,锁分为共享锁(S锁)和排它锁(X锁)。共享锁允许多个事务同时读取同一数据,但是不允许修改。排它锁则允许事务对数据进行读取和修改,其他事务不能同时读取或修改同一数据。 隔离级别...
### MySQL加锁分析 #### 背景 MySQL/InnoDB的加锁机制一直是数据库管理领域的一个难点。在日常工作中,经常会遇到与之相关的疑问,尤其是关于如何避免或解决死锁的问题。本篇文章旨在深入剖析MySQL/InnoDB的加锁...
InnoDB的锁模式包括共享锁(S)和排它锁(X)。共享锁允许多个事务同时读取同一个资源,而排它锁则不允许其他事务读取或写入锁定的资源。除此之外,InnoDB还存在一些特殊的锁模式,例如插入意向锁(LOCK_INSERT_...
在MySQL中,DELETE语句的加锁行为是数据库事务处理的重要组成部分,尤其是在并发环境中,正确理解其加锁机制对于避免死锁和提高系统性能至关重要。本篇文章主要探讨了在不同隔离级别下,针对不同索引类型的DELETE...
2. **判断加锁类型**:如果是当前读,进一步判断加锁类型是共享锁(S锁)还是排他锁(X锁)。 3. **分析锁的影响范围**:考虑锁的范围,比如是在单个记录、索引还是表级别。 4. **评估潜在风险**:分析加锁可能带来...
MySQL/InnoDB的加锁分析是数据库管理中的一个重要话题,因为正确理解加锁机制对于优化查询性能和避免死锁至关重要。本文主要探讨了MySQL/InnoDB存储引擎中的锁机制,特别是MVCC(多版本并发控制)以及不同类型的读写...
MySQL通过死锁检测机制来检测并解决死锁,当检测到死锁时,会回滚其中一个事务,让其他事务得以继续执行。 总结来说,理解MySQL的加锁处理对于优化并发性能和避免死锁至关重要。通过深入分析SQL语句的加锁行为、...
4. **锁模式**:共享锁(S锁)允许多个事务同时读取数据,而排他锁(X锁)则禁止其他事务对加锁的数据进行任何操作。 #### 七、总结 通过对MySQL/InnoDB加锁机制的深入探讨,我们不仅了解了其背后的原理和技术细节...
对于像MySQL这样的关系型数据库,掌握正确的加锁策略、事务设计以及锁等待超时设置等知识,是确保系统稳定运行的关键。 在本案例中,我们不仅学习了如何阅读和理解死锁日志,更重要的是了解了死锁发生的具体原因...
MySQL事务与锁详解的知识点如下: 1. 事务的理解与应用场景: 事务是数据库管理系统(DBMS)执行过程中的逻辑单位,是一个不可分割的工作单元,可以包含一条或多条DML语句。在实际应用中,事务常见的使用场景包括:当...
在MySQL中,尤其是在InnoDB存储引擎下,当检测到死锁时,MySQL会自动选择回滚其中一个事务来解除死锁状态。 #### 二、死锁产生的原因 1. **循环等待**:多个事务之间存在循环的资源等待关系。 2. **互斥条件**:...
锁机制是数据库管理系统中用来确保数据并发访问一致性、有效性和完整性的关键技术。...对于可能出现的锁争用和性能瓶颈,通过查看相关的状态变量和日志信息来进行优化,同时要避免死锁的发生,确保系统的稳定运行。
在死锁发生时,两个事务都在尝试插入新用户,每个事务都在其各自的ID上加锁,但由于ID不存在,实际加的是范围锁。当一个事务尝试获取另一个事务已经持有的锁时,就会发生死锁。 在MySQL的InnoDB存储引擎中,如果...
其他事务可以再对数据加S锁,但不能加X锁,直到原事务释放S锁。 2. **排他锁(X)**:又称写锁,允许事务读取和修改数据,不允许其他事务加任何类型的锁,直到事务结束释放锁。 3. **意向锁**:在InnoDB中,为了...
- **排它锁(X锁)**:阻止其他事务获取任何类型的锁。用于写操作,保证数据在修改过程中不被其他事务读取或修改。 - **意向锁**:意向锁是事务在获取表中的行级锁之前先获取的一种锁类型。意向锁分为意向共享锁(IS)...
死锁日志会显示参与死锁的各个事务及其持有的锁和等待的锁信息。通过分析这些日志,可以了解每个事务所持有的锁类型和状态。例如,事务可能持有表级意向锁和行级锁,等待状态可能表示需要获得其他事务持有的锁。...
InnoDB是MySQL中最常用的事务型存储引擎,它支持行级锁和表级锁,但在默认情况下使用行级锁。 ##### InnoDB行级锁的特点 - **高并发**:由于锁定的范围较小,可以更好地支持并发操作。 - **死锁检测**:InnoDB具有...