Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Sambungan pangkalan data PHP lanjutan: urus niaga, kunci dan kawalan konkurensi

Sambungan pangkalan data PHP lanjutan: urus niaga, kunci dan kawalan konkurensi

WBOY
WBOYasal
2024-06-01 11:43:56326semak imbas

Sambungan pangkalan data PHP lanjutan melibatkan transaksi, kunci dan kawalan serentak untuk memastikan integriti data dan mengelakkan ralat. Transaksi ialah unit atom bagi satu set operasi, diuruskan melalui kaedah beginTransaction(), commit(), dan rollback(). Kunci menghalang akses serentak kepada data melalui PDO::LOCK_SHARED dan PDO::LOCK_EXCLUSIVE. Kawalan konkurensi menyelaraskan akses kepada berbilang transaksi melalui tahap pengasingan MySQL (Baca Tidak Komited, Baca Komited, Bacaan Boleh Ulang, Boleh Bersiri). Dalam aplikasi praktikal, urus niaga, kunci dan kawalan konkurensi digunakan untuk pengurusan inventori produk di tapak web beli-belah untuk memastikan integriti data dan mengelakkan masalah inventori.

高级 PHP 数据库连接:事务、锁和并发控制

Sambungan Pangkalan Data PHP Lanjutan: Transaksi, Kunci dan Kawalan Konkurensi

Apabila berinteraksi dengan pangkalan data menggunakan PHP, memahami konsep lanjutan seperti urus niaga, kunci dan kawalan serentak adalah penting untuk memastikan integriti data dan mengelakkan ralat dalam aplikasi anda penting.

Transaksi

Transaksi ialah koleksi operasi pangkalan data yang dilaksanakan sebagai unit atom. Ini bermakna semua operasi dalam transaksi sama ada semuanya berjaya atau semua gagal.

Gunakan kaedah beginTransaction(), commit() dan rollback() untuk memulakan, melakukan dan melancarkan transaksi: beginTransaction()commit()rollback() 方法来启动、提交和回滚事务:

$db->beginTransaction();
try {
    // 执行数据库操作
    $db->commit();
} catch (\Exception $e) {
    $db->rollback();
}

锁用于防止事务同时访问相同的数据库数据。PHP 的 PDO 提供了两种锁定模式:

  • PDO::LOCK_SHARED:允许事务读取数据,但不能写入。
  • PDO::LOCK_EXCLUSIVE:允许事务读取和写入数据,但其他事务无法同时访问。

要通过 query() 方法对表行进行锁定:

$stmt = $db->query('SELECT * FROM table WHERE id = 1 FOR UPDATE');

并发控制

并发控制机制确保当多个事务同时访问数据库时不会发生数据冲突。MySQL 提供了以下隔离级别:

  • 读未提交 (READ UNCOMMITTED):事务可以读取其他事务未提交的数据。
  • 读已提交 (READ COMMITTED):事务只能读取其他已提交的事务的数据。
  • 可重复读 (REPEATABLE READ):事务在整个生命周期内都可以看到其他已提交事务的数据,但不能看到未提交的事务的数据。
  • 串行化 (SERIALIZABLE):事务串行执行,避免任何并发冲突。

您可以在连接到数据库时通过 PDO::ATTR_DEFAULT_FETCH_MODE

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$db->setAttribute(PDO::ATTR_TRANSACTION_ISOLATION, PDO::ISOLATION_READ_COMMITTED);

Lock

Kunci digunakan untuk menghalang transaksi daripada mengakses data pangkalan data yang sama pada masa yang sama. PDO PHP menyediakan dua mod penguncian:

  • PDO::LOCK_SHARED: membenarkan transaksi membaca data, tetapi tidak menulis.
  • PDO::LOCK_EXCLUSIVE: Urus niaga dibenarkan untuk membaca dan menulis data, tetapi transaksi lain tidak boleh mengaksesnya pada masa yang sama.
Untuk mengunci baris jadual melalui kaedah query():

// 启动事务
$db->beginTransaction();

// 锁定产品行
$stmt = $db->query('SELECT * FROM products WHERE id = :id FOR UPDATE');
$stmt->bindParam(':id', $productId);
$stmt->execute();

// 获取产品数量
$product = $stmt->fetch();
$quantity = $product['quantity'];

// 检查库存
if ($quantity <= 0) {
    $db->rollback();
    throw new RuntimeException('Product is out of stock.');
}

// 更新库存
$quantity--;
$stmt = $db->prepare('UPDATE products SET quantity = :quantity WHERE id = :id');
$stmt->bindParam(':quantity', $quantity);
$stmt->bindParam(':id', $productId);
$stmt->execute();

// 提交事务
$db->commit();

Concurrency control🎜🎜Mekanisme kawalan concurrency memastikan ia tidak berlaku apabila berbilang transaksi mengakses pangkalan data pada masa yang sama Konflik data. MySQL menyediakan tahap pengasingan berikut: 🎜
  • BACA TAK KOMITED:Urus niaga boleh membaca data tidak komited daripada transaksi lain.
  • MEMBACA KOMITED: Transaksi hanya boleh membaca data daripada urus niaga komited lain.
  • BACA DIULANG: Transaksi boleh melihat data transaksi komited lain sepanjang kitaran hayatnya, tetapi tidak dapat melihat data transaksi tidak komited.
  • BOLEH SIRI: Urus niaga dilaksanakan secara bersiri untuk mengelakkan sebarang konflik serentak.
🎜Anda boleh menetapkan tahap pengasingan melalui pilihan PDO::ATTR_DEFAULT_FETCH_MODE apabila menyambung ke pangkalan data: 🎜rrreee🎜Kes praktikal🎜🎜Pertimbangkan tapak web beli-belah dalam talian di mana pengguna boleh Tambahkan produk ke troli dan beli. Untuk mengelakkan masalah, seperti produk yang sama ditambahkan pada troli beli-belah oleh berbilang pengguna pada masa yang sama, urus niaga, kunci dan kawalan serentak boleh digunakan untuk memastikan integriti data: 🎜rrreee🎜 Dengan menggunakan transaksi, kunci dan kawalan konkurensi , kami boleh memastikan integriti Pangkalan Data pengguna semasa membeli produk dan mengelakkan sebarang isu inventori. 🎜

Atas ialah kandungan terperinci Sambungan pangkalan data PHP lanjutan: urus niaga, kunci dan kawalan konkurensi. 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