QUERI TIDAK SELALU BERJALAN PARALEL
Itu tergantung pada mesin basis data. Dengan MyISAM, hampir setiap kueri memperoleh kunci tingkat tabel yang berarti bahwa kueri dijalankan secara berurutan sebagai antrian. Dengan sebagian besar mesin lain, mereka dapat berjalan secara paralel.
echo_me mengatakan nothing happens at the exact same time and a CPU does not do everything at once
Itu tidak sepenuhnya benar. Ada kemungkinan bahwa DBMS dapat berjalan pada mesin dengan lebih dari satu cpu, dan dengan lebih dari satu antarmuka jaringan. Ini sangat tidak mungkin 2 kueri dapat tiba secara bersamaan - tetapi bukan tidak mungkin, oleh karena itu ada mutex untuk memastikan bahwa transisi pengupas/eksekusi hanya berjalan sebagai utas tunggal (eksekusi - tidak harus proses ringan yang sama).
Ada 2 pendekatan untuk memecahkan DML konkuren - baik untuk menggunakan transaksi (di mana setiap pengguna secara efektif mendapatkan tiruan dari database) dan ketika kueri telah menyelesaikan DBMS mencoba untuk merekonsiliasi setiap perubahan - jika rekonsiliasi gagal, maka DBMS memutar kembali salah satu dari kueri dan melaporkannya sebagai gagal. Pendekatan lainnya adalah dengan menggunakan penguncian tingkat baris - DBMS mengidentifikasi baris yang akan diperbarui oleh kueri dan menandainya sebagai dicadangkan untuk pembaruan (pengguna lain dapat membaca versi asli setiap baris tetapi setiap upaya untuk memperbarui data akan diblokir sampai baris tersedia lagi).
Masalah Anda adalah Anda memiliki dua klien mysql, yang masing-masing telah mengambil fakta bahwa ada satu item stok yang tersisa. Ini semakin diperumit oleh fakta bahwa (sejak Anda menyebutkan PHP) tingkat stok mungkin telah diambil dalam sesi DBMS yang berbeda dari penyesuaian stok berikutnya - Anda tidak dapat memiliki transaksi yang mencakup lebih dari permintaan HTTP. Oleh karena itu, Anda perlu memvalidasi ulang setiap fakta yang disimpan di luar DBMS dalam satu transaksi.
Penguncian optimis dapat membuat pseudo - mekanisme kontrol transaksi - Anda menandai catatan yang akan Anda ubah dengan stempel waktu dan pengidentifikasi pengguna (dengan PHP ID sesi PHP adalah pilihan yang baik) - jika ketika Anda datang untuk memodifikasinya, sesuatu yang lain telah mengubahnya, maka kode Anda mengetahui bahwa data yang diambil sebelumnya tidak valid. Namun hal ini dapat menyebabkan komplikasi lain.