Jika Anda ingin mengunci tabel pada baris tertentu yang dipilih, Anda perlu LOCK FIRST mereka menggunakan FOR UPDATE / FOR SHARE pernyataan. Misalnya, dalam kasus Anda jika Anda perlu mengunci baris pertama, lakukan ini:
BEGIN;
LOCK TABLE person IN ROW EXCLUSIVE MODE;
-- BLOCK 1
SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;
-- BLOCK 2
UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;
END;
Dalam BLOCK1 sebelum SELECT pernyataan Anda tidak melakukan apa-apa hanya memberi tahu database "Hei, saya akan melakukan sesuatu di tabel ini, jadi ketika saya melakukannya, kunci tabel ini dalam mode ini". Anda dapat memilih / memperbarui / menghapus baris mana pun.
Tapi di BLOCK2 ketika Anda menggunakan FOR UPDATE Anda mengunci baris itu ke transaksi lain ke mode tertentu (baca doc untuk lebih jelasnya). Akan dikunci sampai transaksi tersebut berakhir.
Jika Anda memerlukan contoh, lakukan tes dan coba lakukan SELECT ... FOR UPDATE di BLOCK2 sebelum mengakhiri transaksi pertama. Ini akan menunggu transaksi pertama berakhir dan akan memilih tepat setelahnya.
Saya menggunakannya dalam fungsi untuk mengontrol urutan dan itu bagus. Semoga Anda menikmati.