【问题标题】:Database deadlock by select statementselect语句导致数据库死锁
【发布时间】:2015-02-05 04:01:45
【问题描述】:
我了解当两个或多个实体阻塞某些源时会发生死锁,但它们都无法完成,因为它们以循环方式阻塞源。
select语句会发生死锁吗?选择语句是否阻塞了资源。?我相信插入或更新会阻塞行,但对 select 语句不太确定。请指教。
【问题讨论】:
标签:
mysql
database
deadlock
database-deadlocks
【解决方案1】:
使用 InnoDB 存储引擎(默认),读取是非阻塞的 - 所以两个选择不能互相阻塞。 InnoDB 是一个使用 MVCC(多版本并发控制)的版本控制引擎,这意味着事务 (A) 将在某个时刻获取感兴趣的记录的副本——如果它修改然后提交数据,那么之后开始的任何事务提交将看到新副本,但在此之前开始的事务在 A 开始之后但在 A 提交之前开始 (B) 的任何事务都将看到 A 看到的副本。只有当其中一个事务修改数据时才会发生死锁(InnoDB 中的锁定发生在行级基础上)。
有关详细信息,请参阅 here 和 here。对于 MyISAM 表(我对此知之甚少!),请在此处查看比较或仅在 Google 上查看“MyISAM vs InnoDB”(129,000 次点击。