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

Как да избегнем условията на състезание, когато използваме метода find_or_create на DBIx::Class::ResultSet?

Не, документацията е неправилна. Използването на транзакция самоне избягвайте този проблем. Той само гарантира, че цялата транзакция се връща назад, ако възникне изключение - така че няма да се запази непоследователно състояние в базата данни.

Заизбягване този проблем трябва да заключите таблицата - вътре в транзакция, защото всички заключвания се освобождават в края на транзакцията. Нещо като:

BEGIN;
LOCK TABLE mytbl IN SHARE MODE;

-- do your find_or_create here

COMMIT;

Но това не е магически лек за всичко. Това може да се превърне в проблем с производителността и може да има блокировки (едновременни транзакции взаимно се опитват да заключат ресурси, които другият вече е заключил). PostgreSQL ще открие такова условие и ще отмени всички конкуриращи се транзакции, освен една. Трябва да сте готови да опитате отново операцията при неуспех.

Ръководството на PostgreSQL относно заключванията.

Ако нямате много паралелност, може просто да игнорирате проблема. Времевият интервал е много малък, така че наистина се случва много рядко. Ако откриете грешката при нарушение на дублирания ключ, което няма да навреди, значи сте покрили и това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заявка за Squeel и Heroku, Postgres:Грешка при използване на GROUP BY и ORDER

  2. Грешка в Postgres:не можа да се отвори файл за четене:Разрешението е отказано

  3. Основна/кръстосана таблица с повече от една колона със стойности

  4. Postgres on Rails ФАТАЛНО:базата данни не съществува

  5. Postgresql:Експортиране на CSV с екранирани нови редове