我的数据库中有帖子和组织.帖子属于组织和组织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个线程.如果没有锁定或事务块,则会按预期发生重复序列号.使用锁和事务块,所有序列号看起来都是唯一的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。