Penguncian MySQL asli tidak menyediakan fungsi ini. Anda dapat menggunakan kolom untuk melakukan "penguncian" Anda.
Dengan asumsi setiap utas memiliki ID unik, Anda dapat membuat kolom bernama thread_owner
, dengan default 0.
Satu utas akan mengambil baris seperti ini:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
Kemudian pilih baris seperti ini (mungkin tidak menghasilkan apa-apa, jika tidak ada baris yang akan diproses):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
Kemudian proses, dan terakhir hapus.
Solusi ini akan bekerja pada MyISAM dan InnoDB.
Namun, untuk InnoDB, mungkin lambat karena setiap pernyataan UPDATE mencoba mengunci semua baris di mana thread_owner =0, dan kecuali Anda yakin Anda mengunci semua baris dalam urutan yang sama setiap kali, itu bahkan bisa menyebabkan kebuntuan. Jadi, Anda dapat mencoba mengunci seluruh tabel secara eksplisit dalam pernyataan UPDATE Anda:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
Dengan begitu, MyISAM dan InnoDB akan bekerja dengan cara yang sama.