首页 > 解决方案 > 进行试运行以查看数据库行是否已锁定

问题描述

假设我正在尝试UPDATE在 mysql (Innodb) 中执行以下语句:

UPDATE main SET name = "Ralph" WHERE rowid=19283

在执行此语句之前,是否有办法在运行此更新之前查看 rowid=19283 上是否存在行/表级锁定?或者是处理死锁的应用策略是捕获异常,事后处理?我发现一旦达到死锁,如果没有一些非常循环的逻辑,通常不可能更新该行,因此我正在查看是否可以在潜在的 UPDATE/INSERT 语句之前检测到死锁

标签: mysqlinnodb

解决方案


一个常见的模式是

BEGIN;
SELECT ... FOR UPDATE;  -- grab a lock on the row
... do some other processing, then eventually:
UPDATE ...   -- change the row (or maybe skip this in some cases)
COMMIT;

这允许多个连接优雅地更改该行,但不会相互踩踏。

不,这并不能消除死锁。它可能会将死锁变成“锁定等待”,这很好。

这不是一个“试运行”。它将锁从UPDATE后面移到SELECT. 如果在此过程中发生其他事情以及竞争事务,则可能会出现死锁。

如果您有 2 个连接“完全”同时执行该事务,则一个将等到另一个完成。(没有死锁。)


推荐阅读