2015-05-28 2 views
0

Если мы отправляем два запроса параллельно, обновления db одного процесса не видны другому процессу. Фактически мы загружаем файлы с некоторыми данными, и есть уникальный чек (не на уровне модели или db, контролируемый некоторыми бизнес-правилами) по определенному атрибуту.Удаляет два процесса, неспособных видеть друг друга. Обновления db

Process 1: 
foo1 = Foo.new(data from file) 
foo1.number = 1 # from file 
foo1.save 
foo1.process # it will only get processed if there is no other Foo with same number i.e. 1 

Process 2: 
foo2 = Foo.new(data from file) 
foo2.number = 1 # some other user has uploaded the file with same number 
foo2.save 
foo2.process # it will only get processed if there is no other Foo with same number i.e. 1 

Как я могу справиться с этой ситуацией, так что я могу позволить один процесс полной и сделать Foo.number (DB запрос) доступен для другого процесса? Я не использую транзакцию базы данных.

Rails 3.2.9, Apache, Phusion_Passenger 4

Редактировать

Пожалуйста, обратите внимание, что foo1 и foo2 различные записи в базе данных, и то, что я хочу, чтобы иметь возможность process1 видеть foo2.number из Process2 и наоборот, так что Я могу сделать один из них дублированным.

ответ

0

Похоже, вы должны использовать Optimistic Lock (here подробнее). В этом случае только один запрос будет иметь возможность изменять данные.

+0

спасибо @ethyl, обратите внимание, что 'foo1' и' foo2' - разные записи в базе данных, и я хочу, чтобы 'process1' смотрел' foo2.number' 'process2' и наоборот, чтобы я может сделать один из них дублированным. (отредактировал вопрос выше) – Saim

Смежные вопросы