首頁  >  文章  >  後端開發  >  sina-app-engine - SAE如何实现php锁?

sina-app-engine - SAE如何实现php锁?

WBOY
WBOY原創
2016-06-06 20:31:47953瀏覽

我在sae上有一个应用, 但是用户注册时我需要进行锁表操作, 但是sae并没有给应用锁表的权限, 所以我希望自己实现个锁来管理用户注册防止出错, 不过sae的临时目录不是请求间共享的, 而且代码空间只读, 在这种情况下还能怎么实现锁呢?

回复内容:

我在sae上有一个应用, 但是用户注册时我需要进行锁表操作, 但是sae并没有给应用锁表的权限, 所以我希望自己实现个锁来管理用户注册防止出错, 不过sae的临时目录不是请求间共享的, 而且代码空间只读, 在这种情况下还能怎么实现锁呢?

为什么要锁表呢? 最终的目的是“用户注册防止出错”,直接用事务就可以搞定了。

------没事务怎么办? SAE没有提供InnoDB,只能用MyISAM,那可以利用主键的唯一性搞个锁:

  • 创建一个locked_tables表来保存已经锁住了的表,如下:
<code>CREATE TABLE `locked_tables` (
  `table_id` int(11) NOT NULL,
  PRIMARY KEY (`table`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
</code>

其中table_id是表的ID,自行分配,比如test这张表分配为1

  • 锁表,使用insert插入要锁的表的ID就可以了,比如锁test表:
<code>INSERT INTO `locked_tables` ( `table_id` ) VALUES ( 1 ); -- test先前分配的ID是1
</code>

如果insert执行成功,则锁表成功;否则一般会因为Duplicate entry '1' for key 'PRIMARY'而失败,说明有人已经锁过这张表了,则应等待此表被释放。

  • 释放锁,使用delete删除即可,比如还是test表:
<code>DELETE FROM `locked_tables` WHERE `table_id` = 1
</code>

大体思路是这样,具体代码偶就没有时间去搞了,请自行实现。

使用数据库实现如何?
是在一条记录上,开始标记为1,结束标记为0
有人注册就检查如果为0就标记为1开始注册过程,注册完成改为0;如果检查为1就一直循环读取这条记录直到为0
当然,如果注册中进程崩溃,那么就永远没人能注册了,哈哈。(不过你可以加一个update_time,来判断最大等待时间。)

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn