Bolehkah Transaksi MySQL dengan PDO Berjalan Serentak Tanpa Gangguan?

Linda Hamilton
Lepaskan: 2024-10-28 04:16:02
asal
828 orang telah melayarinya

 Can MySQL Transactions with PDO Run Concurrently Without Interference?

Menerokai Keselarasan Transaksi MySQL dengan PDO

Topik transaksi pangkalan data selalunya disertakan dengan akronim ACID, mewakili Atomicity, Consistency, Isolation dan Durability. Dalam istilah yang lebih mudah, urus niaga memastikan operasi pangkalan data dilakukan dengan pasti dan tidak terjejas oleh sambungan serentak yang lain.

Walau bagaimanapun, satu persoalan timbul: bolehkah berbilang skrip PHP menjalankan transaksi serentak tanpa gangguan? Untuk memahami perkara ini, pertimbangkan senario berikut:

Anggapkan jadual bernama "pekerja" dengan dua medan: "id" dan "gaji." Dua skrip, script1.php dan script2.php, laksanakan kod berikut serentak:

<code class="php">$conn->beginTransaction();

$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$salary = $row['salary'];
$salary = $salary + 1000;

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit();</code>
Salin selepas log masuk

Apakah yang akan menjadi gaji yang terhasil untuk "ana" dalam senario ini?

Jawapannya bergantung pada tahap pengasingan yang dikonfigurasikan untuk enjin jadual MySQL InnoDB. InnoDB menyokong empat tahap pengasingan, seperti yang ditentukan oleh standard SQL:

  • Baca Tanpa Komitmen
  • Baca Komited
  • Baca Berulang
  • Boleh Bersiri

Secara lalai, MySQL menggunakan tahap pengasingan "Read Committed". Dalam tahap ini, hasilnya akan menjadi 11000. Ini kerana script1.php dan script2.php membaca data yang sama sebelum salah satu daripada mereka melakukan.

Jika tahap pengasingan "Boleh Bersiri" digunakan, hasilnya akan menjadi 12000. Ini kerana Serializable memastikan transaksi dilaksanakan secara berurutan dan menghalang transaksi lain daripada mengganggu data yang dikunci.

Dalam contoh yang diberikan, urutan peristiwa ialah:

  1. skrip1.php memilih data
  2. script2.php memilih data
  3. script1.php mengemas kini data
  4. script2.php mengemas kini data
  5. script1.php commits
  6. script2.php commits

Dengan pengasingan "Read Committed", kedua-dua skrip membaca data yang sama sebelum mana-mana daripadanya melakukan. Oleh itu, kenaikan gaji tidak diasingkan dan digunakan dua kali, menyebabkan kenaikan sebanyak 2000.

Dengan pengasingan "Serializable", transaksi pertama (script1.php) mengunci baris untuk "ana" apabila ia memilih data. Apabila script2.php cuba memilih data yang sama, ia akan menunggu sehingga transaksi pertama dilakukan. Ini memastikan bahawa data tidak diubah suai oleh transaksi lain semasa ia dibaca, dan kenaikan gaji hanya digunakan sekali, menyebabkan peningkatan sebanyak 1000.

Oleh itu, gangguan antara transaksi serentak bergantung kepada tahap pengasingan dan urutan operasi tertentu. Memahami implikasi tahap pengasingan yang berbeza adalah penting untuk memastikan urus niaga berkelakuan seperti yang dimaksudkan dalam persekitaran serentak.

Atas ialah kandungan terperinci Bolehkah Transaksi MySQL dengan PDO Berjalan Serentak Tanpa Gangguan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!