PHP 開発における分散ロックと同時実行制御に対処する方法

WBOY
リリース: 2023-10-08 11:50:02
オリジナル
1263 人が閲覧しました

PHP 開発における分散ロックと同時実行制御に対処する方法

タイトル: PHP 開発における分散ロックと同時実行制御の実践

同時実行性の高い Web アプリケーション開発では、分散ロックと同時実行制御は不可欠な技術手段です。この記事では、PHP を使用して分散ロックと同時実行制御を処理する方法を、具体的なコード例とともに紹介します。

  1. 分散ロックの概念
    分散ロックとは、分散システム内の特定のリソースに対するデータ操作の順序と一貫性を保証するメカニズムを指します。同時実行性の高いシナリオでは、分散ロックにより、複数のプロセスが同時に同じリソースにアクセスして変更するのを防ぐことができるため、データの正確性が確保されます。
  2. 分散ロックの実装方法
    2.1 キャッシュベースの実装
    キャッシュを使用して分散ロックを実装するのは一般的で簡単な方法であり、Redis や Memcached などのキャッシュ サービスを使用して実装できます。
    サンプル コードは次のとおりです。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$lockKey = 'resource_lock';
$lockExpire = 10;

// 尝试获取锁
$lockResult = $redis->set($lockKey, 1, ['NX', 'EX' => $lockExpire]);

if ($lockResult) {
    // 获取锁成功,执行业务逻辑
    // ...

    // 释放锁
    $redis->del($lockKey);
} else {
    // 获取锁失败,处理业务逻辑
    // ...
}
ログイン後にコピー

2.2 データベース ベースの実装
データベースに新しいテーブルを追加して分散ロックをシミュレートし、データベースのトランザクション特性を使用してロック機能を実装します。
サンプル コードは次のとおりです。

// 假设数据库连接已经创建
$lockTable = 'resource_lock';
$lockExpire = 10;

$pdo->beginTransaction();

try {
    // 尝试获取锁
    $selectSql = "SELECT * FROM $lockTable WHERE resource='resource_key' FOR UPDATE";
    $selectStmt = $pdo->prepare($selectSql);
    $selectStmt->execute();

    $lockRow = $selectStmt->fetch(PDO::FETCH_ASSOC);

    if ($lockRow) {
        // 锁已经存在,获取锁失败,处理业务逻辑
        // ...
    } else {
        // 锁不存在,获取锁成功,执行业务逻辑
        // ...

        // 插入锁信息
        $insertSql = "INSERT INTO $lockTable (resource, create_time) VALUES ('resource_key', UNIX_TIMESTAMP())";
        $insertStmt = $pdo->prepare($insertSql);
        $insertStmt->execute();

        // 提交事务
        $pdo->commit();
    }
} catch (Exception $e) {
    // 发生异常,回滚事务
    $pdo->rollback();

    // 错误处理
    // ...
}
ログイン後にコピー
  1. 同時実行制御の実装方法
    同時実行制御とは、同時実行性の高い環境でデータの一貫性を確保するための制御方法を指します。一般的な同時実行制御方法には、楽観的ロックと悲観的ロックが含まれます。

3.1 オプティミスティック ロックの実装
オプティミスティック ロックとは、データ操作を実行する前に競合が発生しないことを前提とし、更新時に以前のバージョン番号と一致するかどうかのみを判断して実行することを意味します。一致する場合は更新操作を実行し、一致しない場合はエラー メッセージが返されます。
サンプル コードは次のとおりです。

// 假设从数据库中获取到的数据是当前版本号为2的数据
$data = [
    'id' => 1,
    'name' => 'test',
    'version' => 2
];

$optimizedVersion = $data['version'] + 1;

// 更新数据
$updateSql = "UPDATE resource_table SET name='updated_name', version=$optimizedVersion WHERE id=1 AND version={$data['version']}";
$updateStmt = $pdo->prepare($updateSql);
$updateStmt->execute();

if ($updateStmt->rowCount() <= 0) {
    // 操作失败,版本号不匹配,处理业务逻辑
    // ...
}
ログイン後にコピー

3.2 悲観的ロックの実装
悲観的ロックとは、データ操作を実行する前にロックを取得して、現在のユーザーがデータを排他的に占有でき、他のユーザーがデータを占有できないようにすることを意味します。現在のユーザーがロックを解放するまでデータを変更します。
サンプル コードは次のとおりです:

$pdo->beginTransaction();

try {
    // 获取锁
    $selectSql = "SELECT * FROM resource_table WHERE id=1 FOR UPDATE";
    $selectStmt = $pdo->prepare($selectSql);
    $selectStmt->execute();

    $data = $selectStmt->fetch(PDO::FETCH_ASSOC);

    if ($data) {
        // 获取锁成功,执行业务逻辑
        // ...

        // 释放锁
        $pdo->commit();
    } else {
        // 获取锁失败,处理业务逻辑
        // ...
    }
} catch (Exception $e) {
    // 发生异常,回滚事务
    $pdo->rollback();

    // 错误处理
    // ...
}
ログイン後にコピー

概要:
PHP 開発では、分散ロックと同時実行制御は、高い同時実行性とデータ一貫性を実現するための重要な手段です。この記事では、キャッシュとデータベースに基づいた分散ロックの実装と、楽観的ロックと悲観的ロックの同時実行制御の実装を紹介し、具体的なコード例を示します。読者が開発時に分散ロックと同時実行をより適切に処理するのに役立つことを願っています。 . コントロールされたシーン。

以上がPHP 開発における分散ロックと同時実行制御に対処する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!