锁定导轨上的行更新以避免冲突.(Postgres后端)

use*_*110 6 ruby-on-rails rails-models rails-activerecord

所以我的模型对象上有一个方法,当行中的二进制字段从null更新为true时,它创建一个唯一的序列号.它实现如下:

class AnswerHeader < ApplicationRecord
  before_save :update_survey_complete_sequence, if: :survey_complete_changed?

  def update_survey_complete_sequence
    maxval =AnswerHeader.maximum('survey_complete_sequence')
    self.survey_complete_sequence=maxval+1
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要锁定什么,以便同时更新两行不会导致两行具有相同的survey_complete_sequence?

如果可以锁定单个行而不是整个表,那将是一个好的,因为这是用户经常访问的表.

小智 1

如果您使用 postgress,也许Sequenced可以帮助您,而无需在数据库级别定义序列。

Survey_complete_sequence 是否应该是增量的?如果没有,也许随机化一个bigint?