我正在用PHP创建一个网站,我想在其中出售一些收费号码.对于每个请求,我必须以原子方式执行以下操作:
>询问数据库是否有可用的费用号码
>将费用编号标记为已售出
>增加一个数字(在文件或数据库中),显示客户端的数量有一个充电号码
我知道如何做这些操作,如果它可能会有所帮助,我使用的是mysql.但我的问题是如何在所有请求之间做这些操作原子?我是说如何强制web服务器(apache)和php解释器为所有请求逐个运行这个部分,而不是以并行方式运行?
P.s:请将您的答案作为php的解决方案,而不是数据库相关的解决方案.
解决方法:
所有这些操作都依赖于数据库.因此,您并不需要在关键部分中运行PHP代码;它足以在数据库中序列化这些操作.
执行这些操作时,最简单的方法是LOCK TABLES ... WRITE
;这保证了只有一个脚本可以同时与数据库通信.
另一种方法是SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
并在关闭自动提交的事务中运行所有操作(即使您决定使用表锁,也应该使用事务来确保数据完整性).
更新:如果您绝对必须在PHP中执行此操作,那么您可以使用flock
实现目标:
$fp = fopen('sunc_file', 'r+');
if (flock($fp, LOCK_EX)) {
// Perform database ops here
flock($fp, LOCK_UN); // release the lock
}
else {
die("Couldn't get the lock!");
}
fclose($fp);
以独占模式flock将阻止任何其他进程锁定保护文件,从而让您的脚本严格执行序列化,但请阅读手册页上的巨红警告!