我正在实现一个使用 MongoDB findAndModify 来模拟资源锁的解决方案。
我的问题是,findAndModify 是否在副本集上提供与在单个实例上相同的原子性?
这是一个示例 PHP 代码
$lock = $this->getMongoDb()->selectCollection('users')->findAndModify(
array(
'_id' => new MongoId($id),
'$or' => array(
array('transaction.locked' => array('$ne'=>true)),
array('transaction.locked' => true, 'transaction.timestamp' => array('$lt' => new MongoDate(strtotime($lock_timeout))))
)
),
array(
'$set' => array(
'transaction.locked' => true,
"transaction.timestamp" => new MongoDate(strtotime($current_time))
)
)
);
我通过检查记录是否存在且未锁定来创建锁,然后记录被锁定。
如果我尝试同时多次对副本集执行此操作,findAndModify 是否仍会通过允许第一次调用成功来作为同步锁工作?
谢谢