Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menangani kunci yang diedarkan dan kawalan konkurensi dalam pembangunan PHP

Bagaimana untuk menangani kunci yang diedarkan dan kawalan konkurensi dalam pembangunan PHP

WBOY
WBOYasal
2023-10-08 11:48:231274semak imbas

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.

  1. Konsep kunci teragih
    Kunci teragih merujuk kepada mekanisme yang memastikan susunan dan ketekalan operasi data untuk sumber tertentu dalam sistem teragih. Dalam senario konkurensi tinggi, kunci yang diedarkan boleh menghalang berbilang proses daripada mengakses dan mengubah suai sumber yang sama pada masa yang sama, dengan itu memastikan ketepatan data.
  2. Kaedah pelaksanaan kunci teragih
    2.1 Pelaksanaan berasaskan cache
    Menggunakan cache untuk melaksanakan kunci teragih ialah cara biasa dan mudah, dan boleh dilaksanakan menggunakan perkhidmatan cache seperti Redis dan Memcached.
    Kod sampel adalah seperti berikut:
$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();

    // 错误处理
    // ...
}
  1. Cara melaksanakan kawalan konkurensi
    Kawalan konkurensi merujuk kepada kaedah kawalan untuk memastikan konsistensi data dalam persekitaran konkurensi yang tinggi. Kaedah kawalan konkurensi biasa termasuk penguncian optimistik dan penguncian pesimis.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn