我正在开发一个记录存储系统,它将扫描,索引和加密的记录存储在物理盒中。
我有一个方法说“getAvailablePlace()”,它会检查哪个框以及哪些seq可用于存储。我想锁定这个方法。即当一个用户进入这个方法并且他得到了盒子:12 seq:55作为空的地方..同时另一个用户正在访问相同的方法他也可能得到相同的值..box:12 seq:55这是错误易发生。
那么,当一个用户已进入此过程时,我是否可以锁定此方法?
我正在使用SQLite,wamp和codeigniter。
答案 0 :(得分:1)
这里有一个通用方法:有另一个表存储当前“锁定”的方框。然后展开“getAvailablePlace()”以检查锁定的框,然后再生成下一个框ID。生成box id后,将其写入锁表。所有这三个操作都必须在数据库事务中进行。
另一个解决方案是为每个框计算数据库中的序列号。如果您执行操作“获取框y的最大序列,添加1,将其写回”在交易中您应该没问题。
答案 1 :(得分:1)
我正在使用此代码:
define('LOCK_FILE', "/path/to/your/lockfile-".$argv[1].".lock");
if( isLocked() ) die("ALREADY RUNNING !!!!\n" );
function isLocked()
{
# If lock file exists, check if stale. If exists and is not stale, return TRUE
# Else, create lock file and return FALSE.
if( file_exists( LOCK_FILE ) )
{
# check if it's stale
$lockingPID = trim( file_get_contents( LOCK_FILE ) );
# Get all active PIDs.
$pids = explode( "\n", trim( `ps -e | awk '{print $1}'` ) );
# If PID is still active, return true
if( in_array( $lockingPID, $pids ) ) return true;
# Lock-file is stale, so kill it. Then move on to re-creating it.
echo "Removing stale lock file.\n";
unlink( LOCK_FILE );
}
file_put_contents( LOCK_FILE, getmypid() . "\n" );
return false;
}
您可以更改它,不要检查pid,只需将文件用作锁定信息。
答案 2 :(得分:0)
你不能在PHP中这样做,因为每个用户都会收到自己的'运行时'。但你可以用一些外部方法来做到这一点,例如:数据库中的locks
表。因此,您的函数检查表中是否存在某些记录,跳过/返回false或者是否为false,如果不存在则运行受保护的代码。
请注意,您必须实现double-checking才能获得真正无错误的代码。