зарезервировать строку на определенное время, используя ActiveRecord - PullRequest
0 голосов
/ 28 декабря 2011

Я хотел бы иметь возможность "зарезервировать" элемент, аналогичный тому, как сиденье самолета заблокировано на короткий период времени, прежде чем оно фактически будет оплачено. Я думаю, что лучший способ это сделать через базу данных и желательно на уровне ORM.

Вот пример:

ActiveRecord::Base.transaction do
  bar = Bar.find(1, :lock => true)
  # do my stuff
end

Мне нужно более гибкое решение.

Вот как я представляю себе концептуальную работу:

# action1: 
# put an expiring lock (30s) on an element (don't block unrelated code) 
# other code

# action2 (after payment):
# come back to the locked element to claim ownership of it

ОБНОВЛЕНИЕ : Любой, кто пытается сделать это в Rails, должен сначала попробовать использовать встроенную оптимистическую блокировку .

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Добавьте дополнительный столбец locked_until - но остерегайтесь параллелизма.Я бы, наверное, сделал это на слое БД.

0 голосов
/ 28 декабря 2011

Я мог бы иметь отдельную таблицу специально для этой цели, которая называется potential_owner. У него будет метка времени, чтобы можно было определить время. В основном это будет работать примерно так:

# lock the table
# check latest record to see if the element is available
# add a new record or die

Это довольно просто реализовать, однако блокировка не является мелкозернистой. Таблица описывает потенциальное владение различными элементами, и простая проверка блокирует всю таблицу. В решении ТАСС заблокирована только строка для определенного элемента.

...