PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Spójność w postgresql z blokowaniem i wyborem do aktualizacji

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;

Wydaje się, że to działa w Read Committed. Jest to tylko sql (tak samo jak twój kod) i może być wykonany w jednym wywołaniu (szybciej).

@Seth Robertson:Bez LOCK TABLE i pętli while nie jest to bezpieczne.

Jeśli istnieje transakcja A i transakcja B w tym samym czasie:A wybierze pierwszy wiersz, a B wybierze pierwszy wiersz. A zablokuje i zaktualizuje wiersz, B musi poczekać na zatwierdzenie A. Następnie B ponownie sprawdzi warunek nazwa_zadania IS NULL. To jest fałszywe i B nie zaktualizuje się - B nie wybierze następnego wiersza, ale tylko ponownie sprawdzi i zwróci pusty wynik.

@joegester:WYBIERZ DO AKTUALIZACJI nie stanowi problemu, ponieważ wszystkie tabele są zablokowane.

Może istnieje inny sposób wykonania zadania - jeśli usuniesz i wstawisz wiersze (w innej tabeli?) zamiast tego ustawisz NULL. Ale nie jestem pewien jak.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL:pobierz uporządkowane wiersze z tabeli — II

  2. PostgreSQL - relacja [tabela] nie istnieje

  3. utwórz tabelę w postgreSQL

  4. Postgres wyłącza się natychmiast po uruchomieniu z docker-compose

  5. Jak mogę nasłuchiwać bazy danych postgresql za pomocą SignalR Core w projekcie .net core?