如何在 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中的共享锁与排他锁

转 MySQL中的共享锁与排他锁

数据库:Mysql中“select ... for update”排他锁分析

数据库:Mysql中“select ... for update”排他锁分析

浅谈Mysql共享锁排他锁悲观锁乐观锁及其使用场景