编写多线程应用程序时,遇到的最常见问题之一是死锁.
我对社区的问题是:
什么是僵局?
你怎么发现它们?
你处理它们吗?
最后,你如何防止它们发生?
我想向新手解释线程死锁.我见过许多死锁的例子,有些使用代码,有些使用插图(比如着名的4辆汽车).还有像The Dining Philosophers这样经典的容易陷入僵局的问题,但这些问题可能过于复杂,无法让真正的新手完全掌握.
我正在寻找最简单的代码示例来说明死锁是什么.这个例子应该:
您有什么推荐的吗?
我发现了一个非常令人困惑的死锁情况,我需要帮助才能理解.
有两个事务正在进行:
(2)持有查询锁delete from myTable where id = NAME_CONST('p_id',10000).这是PRIMARY KEY的锁定,虽然不是完整的密钥而是范围.看起来这对我来说是一个完整的写锁定lock_mode X locks rec but not gap.
(1)正在等待同样的锁,也用于查询delete from myTable where id = NAME_CONST('p_id',10000).
(2)也试着去获取此锁并且MySQL检测到死锁.
我无法理解的是为什么(2)必须再次获取锁,因为它已经拥有它并且它在所有情况下都是写锁(lock_mode X).
它看起来也像是完全相同的查询.
这是表定义
create myTable (
id int unsigned not null,
value1 char(8) not null,
value2 int unsigned,
primary key (id, value1)
);
Run Code Online (Sandbox Code Playgroud)
这是来自的信息 SHOW ENGINE INNODB STATUS\G
------------------------
LATEST DETECTED DEADLOCK
------------------------
130313 14:46:28
*** (1) TRANSACTION:
TRANSACTION 75ACB8A3, ACTIVE 0 sec, process no 6110, OS thread id …Run Code Online (Sandbox Code Playgroud)