PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Съгласуваност в postgresql със заключване и избор за актуализация

BEGIN; 
LOCK TABLE slots IN ACCESS EXCLUSIVE MODE; 
UPDATE slots SET job_name = '111' WHERE id IN (SELECT id FROM slots WHERE job_name IS NULL LIMIT 1) RETURNING *;
COMMIT;

Това изглежда работи в Read Committed. Той е само sql (същия като вашия код) и може да се изпълни с едно извикване (по-бързо).

@Seth Robertson:Не е безопасно без LOCK TABLE и без цикъл while.

Ако има транзакция A и транзакция B едновременно:A ще избере първия ред и B ще избере първия ред. A ще заключи и актуализира реда, B трябва да изчака, докато A се ангажира. Тогава B ще провери отново условието име_задание IS NULL. Невярно е и B няма да актуализира - B няма да избере следващия ред, а само ще провери отново и ще върне празен резултат.

@joegester:SELECT FOR UPDATE не е проблемът, защото цялата таблица е заключена.

Може би има друг начин да свършите работа - ако изтриете и вмъкнете редове (в друга таблица?), Вместо това задайте NULL. Но не съм сигурен как.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. не разбирам json_agg в този контекст

  2. Практически ограничения на изразните индекси в PostgreSQL

  3. Как да репликирате PostgreSQL данни на отдалечени сайтове

  4. PostgreSQL:Как да предавам параметри от командния ред?

  5. Използване на инструменти за хибернация за обратно инженерство на pojos от Postgres