加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 将范围内的自动增量添加到migration-file rail

发布时间:2020-12-17 03:47:54 所属栏目:百科 来源:网络整理
导读:我的数据库中有帖子和组织.帖子属于组织和组织has_many帖子. 我的帖子表中有一个现有的post_id列,我现在在创建新帖子时手动增加. 如何将自动增量添加到作用于organisation_id的列? 目前我使用mysql作为我的数据库,但我打算切换到PostgreSQL,所以如果可能,解
我的数据库中有帖子和组织.帖子属于组织和组织has_many帖子.

我的帖子表中有一个现有的post_id列,我现在在创建新帖子时手动增加.
如何将自动增量添加到作用于organisation_id的列?

目前我使用mysql作为我的数据库,但我打算切换到PostgreSQL,所以如果可能,解决方案应该适用于两者:)

非常感谢!

解决方法

@ richard-huxton有正确的答案,并且是线程安全的.

使用事务块并在该事务块内使用SELECT FOR UPDATE.这是我的rails实现.在ruby类上使用’transaction’来启动事务块.在要锁定的行上使用“lock”,实质上阻止对该行的所有其他并发访问,这是确保唯一序列号所需的.

class OrderFactory
  def self.create_with_seq(order_attributes)
    order_attributes.symbolize_keys!
    raise "merchant_id required" unless order_attributes.has_key?(:merchant_id)
    merchant_id = order_attributes[:merchant_id]

    SequentialNumber.transaction do
      seq = SequentialNumber.lock.where(merchant_id: merchant_id,type: 'SequentialNumberOrder').first
      seq.number += 1
      seq.save!
      order_attributes[:sb_order_seq] = seq.number
      Order.create(order_attributes)
    end
  end
end

我们运行sidekiq用于后台作业,因此我通过创建1000个后台作业来测试此方法,以使用8个工作程序创建订单,每个工作程序8个线程.如果没有锁定或事务块,则会按预期发生重复序列号.使用锁和事务块,所有序列号看起来都是唯一的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读