Ruby on rails Array.pop竞争条件

Ruby on rails Array.pop竞争条件,ruby-on-rails,arrays,concurrency,locking,race-condition,Ruby On Rails,Arrays,Concurrency,Locking,Race Condition,系统上的3个用户同时单击“购买票证” 型号 class TicketInventory < ActiveRecord::Base serialize :ticket_roll, Array end 他们的票都一样 我曾考虑过锁定版本,但这会导致错误,而不是提供下一张罚单 我还查看了索引,但这需要每张票有一行 如何避免这种竞争状况?您是否尝试使用。它使用事务和数据库锁。根据文档,PostgreSQL和MySQL支持: MySQL: http://dev.mysql.com/doc/r

系统上的3个用户同时单击“购买票证”

型号

class TicketInventory < ActiveRecord::Base
  serialize :ticket_roll, Array
end 
他们的票都一样

我曾考虑过
锁定版本
,但这会导致错误,而不是提供下一张罚单

我还查看了索引,但这需要每张票有一行

如何避免这种竞争状况?

您是否尝试使用。它使用事务和数据库锁。根据文档,PostgreSQL和MySQL支持:

MySQL: http://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html
PostgreSQL: http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-FOR-UPDATE-SHARE
您可以这样使用它:

ticket_inventory = TicketInventory.find(1)
ticket_inventory.with_lock do
  ticket_roll = ticket_inventory.ticket_roll
  @ticket = ticket_roll.pop
  ticket_inventory.save
end

试试看,它可能会起作用。

如果你使用乐观锁定(即锁定版本),你只需要挽救错误,Retry正要写这篇文章
ticket_inventory = TicketInventory.find(1)
ticket_inventory.with_lock do
  ticket_roll = ticket_inventory.ticket_roll
  @ticket = ticket_roll.pop
  ticket_inventory.save
end