ホームページ >バックエンド開発 >PHPチュートリアル >PHP 開発における分散ロックと同時実行制御に対処する方法
タイトル: PHP 開発における分散ロックと同時実行制御の実践
同時実行性の高い Web アプリケーション開発では、分散ロックと同時実行制御は不可欠な技術手段です。この記事では、PHP を使用して分散ロックと同時実行制御を処理する方法を、具体的なコード例とともに紹介します。
$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(); // 错误处理 // ... }
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 サイトの他の関連記事を参照してください。