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.