SELECT FOR UPDATE
mengunci baris yang Anda pilih untuk diperbarui hingga transaksi yang Anda buat berakhir. Transaksi lain hanya dapat membaca baris tersebut tetapi tidak dapat memperbaruinya selama transaksi pilih untuk pembaruan masih terbuka.
Untuk mengunci baris:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Transaksi di atas akan aktif dan akan mengunci baris sampai dilakukan.
Untuk mengujinya, ada berbagai cara. Saya mengujinya menggunakan dua instance terminal dengan klien MySQL dibuka di masing-masing instance.
Pada first terminal
Anda menjalankan SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Pada second terminal
Anda dapat mencoba memperbarui baris:
UPDATE test SET parent = 100 WHERE id = 4;
Karena Anda membuat pilihan untuk pembaruan pada first terminal
kueri di atas akan menunggu hingga transaksi pilih untuk pembaruan dilakukan atau akan habis.
Kembali ke first terminal
dan lakukan transaksi:
COMMIT;
Periksa second terminal
dan Anda akan melihat bahwa kueri pembaruan telah dieksekusi (jika waktu tidak habis).