如何在 MySQL 中使用排他锁?
Posted
技术标签:
【中文标题】如何在 MySQL 中使用排他锁?【英文标题】:How to use exclusive locks in MySQL? 【发布时间】:2013-05-14 11:49:36 【问题描述】:我正在尝试在 php 中使用 mysql 实现我自己的会话处理程序版本。我的版本与现有版本(如 Zend 的)不同,因为我的版本是命名空间的,每个命名空间都是单独存储和锁定的。这是应该在代码中实现的场景:
-
获取 SID+NS 的独占锁
读取 SID+NS 的数据
...请求顺其自然...
将 SID+NS 的数据写回 db
解除锁定
SID:会话 ID - NS:命名空间
现在出现的问题是:
如何在 MySQL 中使用独占锁?
在回答这个问题之前,需要记住一些问题:
-
每个会话中有任意数量的命名空间。
一个请求可能需要持有多个 ex-locks(一个请求可能需要同时处理多个命名空间)。
锁需要使用 MySQL 的内部机制来实现。实现我自己的应用程序级前锁可能非常简单。但是你必须实现队列和信号量来模仿 MySQL 给我们的相同行为,这使得它变得非常困难。我要说的是,我希望我的代码能够在大多数机器上运行而无需进行大量更改,并且我不愿意实现轮询系统,因为它浪费了系统的资源和时间。如果它是使用 MySQL 锁实现的,当发生冲突时,代码将冻结,而不会浪费 CPU 时间或任何资源。
请记住,并非总是存在 SID+NS 的记录。有第一个计时器请求必须先为 SID+NS 插入一条记录,然后才能锁定它。
重要提示:我的问题不是一般如何使用 MySQL 锁。我已经阅读了有关如何执行此操作的所有 MySQL 文档。我的问题伴随着一些特定的场景,在我看来这使得它无法实施。这就是为什么我在这里问它,以确保我是否缺少任何东西。
PS。这是给an open source project的。
【问题讨论】:
【参考方案1】:大家都知道,我设法在上述项目中实现了这一点。所以如果有人感兴趣,他/她可以在那里找到。
【讨论】:
以上是关于如何在 MySQL 中使用排他锁?的主要内容,如果未能解决你的问题,请参考以下文章
数据库:Mysql中“select ... for update”排他锁分析