我正在尝试在 PHP 中使用 MySQL 实现我自己的会话处理程序版本。我的版本与现有版本(如 Zend 的)不同,因为我的版本是命名空间的,每个命名空间都是单独存储和锁定的。这是应该在代码中实现的场景:
- 获取 SID+NS 的独占锁
- 读取 SID+NS 的数据
- ...请求顺其自然...
- 将 SID+NS 的数据写回 db
- 释放锁
SID:会话 ID - NS:命名空间
现在出现的问题是:
如何在 MySQL 中使用独占锁?
在回答这个问题之前,有许多问题需要牢记:
- 每个会话中有任意数量的命名空间。
- 一个请求可能需要持有多个前锁(一个请求可能需要同时处理多个命名空间)。
- 锁需要使用 MySQL 的内部机制来实现。实现我自己的应用程序级前锁可能非常简单。但是你必须实现队列和信号量来模仿 MySQL 给我们的相同行为,这使得它变得非常困难。我要说的是,我希望我的代码能够在大多数机器上运行而无需进行大量更改,并且我不愿意实现轮询系统,因为它浪费了系统的资源和时间。如果它是使用 MySQL 锁实现的,当发生冲突时,代码将冻结,而不会浪费 CPU 时间或任何资源。
- 请记住,并非总是存在 SID+NS 的记录。有第一个计时器请求必须先为 SID+NS 插入一条记录,然后才能锁定它。
重要提示:我的问题不是一般如何使用 MySQL 锁。我已经阅读了有关如何执行此操作的所有 MySQL 文档。我的问题带有一些在我看来无法实施的特定场景。这就是为什么我在这里问它,以确保我是否缺少任何东西。
PS。这是一个开源项目。