Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk menangani kunci yang diedarkan dan kawalan konkurensi dalam pembangunan PHP
Tajuk: Kunci teragih dan amalan kawalan serentak dalam pembangunan PHP
Dalam pembangunan aplikasi web serentak tinggi, kunci teragih dan kawalan serentak adalah cara teknikal yang penting. Artikel ini akan memperkenalkan cara menggunakan PHP untuk mengendalikan kunci yang diedarkan dan kawalan konkurensi, dengan contoh kod khusus.
$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 Berdasarkan pelaksanaan pangkalan data
Simulasikan kunci teragih dengan menambah jadual baharu dalam pangkalan data, dan gunakan ciri transaksi pangkalan data untuk melaksanakan fungsi kunci.
Kod sampel adalah seperti berikut:
// 假设数据库连接已经创建 $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 Pelaksanaan Kunci Optimis
Optimistic Lock bermaksud bahawa sebelum melakukan operasi data, ia dianggap sebagai konflik tidak akan berlaku, dan hanya menentukan sama ada ia sepadan dengan nombor versi sebelumnya semasa kemas kini. , jika tidak mesej ralat akan dikembalikan.
Kod sampel adalah seperti berikut:
// 假设从数据库中获取到的数据是当前版本号为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 Pelaksanaan kunci pesimis
Kunci pesimis bermaksud mendapatkan kunci sebelum melakukan operasi data untuk memastikan pengguna semasa boleh memiliki data secara eksklusif dan pengguna lain tidak boleh mengubah suai data sehingga pengguna semasa mengeluarkan kunci itu.
Kod sampel adalah seperti berikut:
$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(); // 错误处理 // ... }
Ringkasan:
Dalam pembangunan PHP, kunci yang diedarkan dan kawalan konkurensi adalah cara penting untuk mencapai konkurensi yang tinggi dan konsistensi data. Artikel ini memperkenalkan pelaksanaan kunci teragih berdasarkan cache dan pangkalan data, serta pelaksanaan kawalan konkurensi kunci optimistik dan kunci pesimis Ia juga disertakan dengan contoh kod khusus, dengan harapan dapat membantu pembaca mengendalikan kunci yang diedarkan dan konkurensi dalam pembangunan. Adegan terkawal.
Atas ialah kandungan terperinci Bagaimana untuk menangani kunci yang diedarkan dan kawalan konkurensi dalam pembangunan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!