Rumah  >  Artikel  >  pangkalan data  >  Bolehkah Transaksi PHP Serentak dalam PDO MySQL Mengganggu Satu sama lain?

Bolehkah Transaksi PHP Serentak dalam PDO MySQL Mengganggu Satu sama lain?

Linda Hamilton
Linda Hamiltonasal
2024-11-01 04:43:27378semak imbas

 Can Concurrent PHP Transactions in PDO MySQL Interfere with Each other?

Memahami Pengasingan Transaksi dalam PDO MySQL

Dokumentasi PHP menyerlahkan faedah transaksi, menekankan keupayaan mereka untuk memastikan operasi atom, konsisten, terpencil dan tahan lama dalam pangkalan data .

Soalan:

Adakah ini membayangkan bahawa skrip PHP berasingan yang menjalankan urus niaga secara serentak boleh beroperasi tanpa gangguan?

Penerangan tentang Gangguan:

Pertimbangkan pekerja jadual dengan data berikut:

id name salary
1 ana 10000

Dua skrip dengan kod serupa dilaksanakan serentak:

skrip1.php dan skrip2.php:

<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;//increasing salary

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

$conn->commit();</code>

Timbul persoalan berkenaan dengan hasil gaji 'ana' di bawah senario pelaksanaan yang berbeza.

Jawapan:

Hasilnya bergantung pada tahap pengasingan dikonfigurasikan untuk enjin jadual InnoDB dalam MySQL. Empat tahap pengasingan wujud mengikut piawaian SQL:

  • BACA TAK KOMITED: Membenarkan membaca data yang tidak komited. Urus niaga serentak boleh mengganggu satu sama lain.
  • BACA KOMITED: Membenarkan membaca hanya data yang dilakukan oleh transaksi lain. Urus niaga serentak biasanya tidak mengganggu.
  • BACAAN BOLEH DIULANG: Menghalang transaksi lain daripada mengubah suai data yang dibaca oleh transaksi semasa. Urus niaga serentak masih boleh mengganggu jika mereka cuba mengubah suai data yang sama.
  • BOLEH SIRI: Memastikan transaksi dilaksanakan secara bersiri, menghalang sebarang gangguan antara transaksi serentak.

Dalam senario yang diberikan, menggunakan tahap pengasingan BERSERIALIZE dan melumpuhkan autokomit akan menghasilkan gaji sebanyak 12000 kerana setiap transaksi diasingkan dan dilaksanakan secara berurutan.

Walau bagaimanapun, dengan mana-mana tahap pengasingan lain atau BOLEH BERSIRI dengan autokomit didayakan , hasilnya akan menjadi 11000. Ini kerana urus niaga boleh bertindih dalam kes ini, membenarkan kemungkinan gangguan. Menggunakan bacaan mengunci juga boleh menjejaskan keputusan, yang berpotensi membawa kepada gaji 12000 di bawah semua peringkat pengasingan.

Oleh itu, tahap pengasingan khusus dan tetapan konfigurasi yang digunakan akan menentukan gangguan atau kekurangannya antara transaksi serentak dalam skrip PHP .

Atas ialah kandungan terperinci Bolehkah Transaksi PHP Serentak dalam PDO MySQL Mengganggu Satu sama lain?. 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