제목: PHP 개발에서의 분산 잠금 및 동시성 제어 실습
고동시성 웹 애플리케이션 개발에 있어서 분산 잠금 및 동시성 제어는 필수적인 기술적 수단입니다. 이 기사에서는 특정 코드 예제와 함께 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!