Rumah > Artikel > pembangunan bahagian belakang > Sambungan pangkalan data PHP lanjutan: urus niaga, kunci dan kawalan konkurensi
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.
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 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 提供了以下隔离级别:
您可以在连接到数据库时通过 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
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. 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: 🎜
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!