PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kunci baris database selama beberapa transaksi

Solusi Anda dengan bendera tampaknya layak dan saya pikir satu-satunya hal yang diperlukan adalah membuat kunci kedaluwarsa. Pada dasarnya cara saya merancang kunci adalah saya akan menulis stempel waktu ketika kunci diambil dan membuatnya sehingga prosesnya harus memperbarui kunci sesering mungkin (yaitu setiap 30 detik) saat masih bekerja pada rekaman. Jika proses mati atau gagal menyelesaikan pekerjaan, kunci akan kedaluwarsa dan proses lain dapat membuka itu jika lebih dari dua kali lipat periode batas waktu berlalu.

Ketika sebuah proses selesai mengerjakan sebuah record, proses tersebut akan menghapus lock flag dan menandai record sebagai diproses (lagi-lagi flag lain).

Anda mungkin ingin memiliki dua bidang:satu yang akan menyimpan tanda kunci cap waktu dan yang lain yang akan menunjukkan proses mana yang memiliki kunci (jika Anda peduli). Saya berasumsi bahwa ada semacam kunci yang dapat digunakan untuk mengurutkan catatan dalam tabel sehingga konsep "tindakan selanjutnya" bermakna.

Anda dapat menggunakan kueri seperti ini untuk mendapatkan catatan selanjutnya untuk diproses:

 -- find the next available process and "lock" it by updating it's flag
 UPDATE actions_tabe
    SET LockFlag = @timestamp,
        Process = @processname
  WHERE Id IN (SELECT Id
            FROM actions_table
           WHERE LockFlag IS null
             AND IsComplete = '0'
             AND ScheduledTime < now()
           ORDER BY Scheduledtime ASC, Id ASC
           LIMIT 1);

 -- return the Id and Action of the record that was just marked above
 SELECT Id, Action
   FROM actions_table
  WHERE Process = @processname

Contoh Fiddle di sini:http://sqlfiddle.com/#!11/9c120/26 /1




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hasilkan rangkaian tanggal - gunakan tipe tanggal sebagai input

  2. Jatuhkan dan buat ENUM dengan sekuel dengan benar?

  3. Pesan 28000:tidak ada entri pg_hba.conf untuk host \xx.xxx.xxx.xxxx\, pengguna \User, database \databasename\, SSL mati

  4. Kueri 'COMMIT' yang tahan lama dengan status 'idle' di pg_stat_activity

  5. Cara yang tepat untuk menambahkan teks yang tidak lolos dari bidang ke regex di postgres?