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

Jak uniknąć sytuacji wyścigu podczas korzystania z metody find_or_create z DBIx::Class::ResultSet?

Nie, dokumentacja jest nieprawidłowa. Korzystanie z samej transakcji nie uniknąć tego problemu. Gwarantuje tylko, że cała transakcja zostanie wycofana, jeśli wystąpi wyjątek - tak, że żaden niespójny stan nie zostanie utrwalony w bazie danych.

Aby unikać ten problem musisz zablokować tabelę - wewnątrz transakcji, ponieważ wszystkie blokady są zwalniane na koniec transakcji. Coś takiego:

BEGIN;
LOCK TABLE mytbl IN SHARE MODE;

-- do your find_or_create here

COMMIT;

Ale to nie jest magiczne lekarstwo na wszystko. Może to spowodować problem z wydajnością i mogą wystąpić zakleszczenia (transakcje współbieżne, które wzajemnie próbują zablokować zasoby, które drugi już zablokował). PostgreSQL wykryje taki stan i anuluje wszystkie konkurujące transakcje poza jedną. Musisz być przygotowany na ponowną próbę operacji w przypadku niepowodzenia.

Podręcznik PostgreSQL o blokadach.

Jeśli nie masz dużej współbieżności, możesz po prostu zignorować problem. Przedział czasowy jest bardzo mały, więc zdarza się to bardzo rzadko. Jeśli wykryjesz błąd zduplikowanego naruszenia klucza, który nie zaszkodzi, to również to uwzględniłeś.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupuj Postgres według zapytania

  2. GRUPUJ WEDŁUG lub LICZBA wartości podobnych pól — UNPIVOT?

  3. Postgre SQL LIKE dla liczb całkowitych

  4. pg_ctl Wskazówki i porady

  5. Najlepszy sposób na przechowywanie czasu powyżej 24:00:00 w postgresql?