0

我正在实现一个使用 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 是否仍会通过允许第一次调用成功来作为同步锁工作?

谢谢

4

0 回答 0