mysql - 进行试运行以查看数据库行是否已锁定
问题描述
假设我正在尝试UPDATE
在 mysql (Innodb) 中执行以下语句:
UPDATE main SET name = "Ralph" WHERE rowid=19283
在执行此语句之前,是否有办法在运行此更新之前查看 rowid=19283 上是否存在行/表级锁定?或者是处理死锁的应用策略是捕获异常,事后处理?我发现一旦达到死锁,如果没有一些非常循环的逻辑,通常不可能更新该行,因此我正在查看是否可以在潜在的 UPDATE/INSERT 语句之前检测到死锁
解决方案
一个常见的模式是
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 个连接“完全”同时执行该事务,则一个将等到另一个完成。(没有死锁。)
推荐阅读
- sql - 有计数的 SQL UPDATE
- javascript - Javascript中的递归四分位数排序器
- java - 使用 java 上传 csv 文件时,应为 DB 中的每一行添加日期
- jquery - 滚动时单击事件后,活动菜单项不会更改他的类
- r - 将一个数据帧拆分为多个数据帧
- java - RMI 服务器端 java.net.MalformedURLException:未知协议:c
- c# - 使用 Lambda 表达式参数调用通用方法(以及仅在运行时知道的类型)
- regex - 正则表达式以未定义的顺序匹配给定数量的字符
- git - Bitbucket 拉取请求,其中源 repo 是 forkee,目标 repo 是 fork
- vb.net - 如何访问模块中的功能