【发布时间】:2023-12-22 01:57:02
【问题描述】:
我的代码是这样的:
class MessagesController < ApplicationController
@@m = Mutex.new
def index
@@m.synchronize do
Message.transaction do
m = Message.find_by_msg_id(params[:msg_id])
if m.nil?
mess = Message.new(:msg_id => params[:msg_id], ......)
mess.save!
......
end
end
end
end
end
现在的问题是数据库中的消息仍然具有相同的msg_id。
请帮帮我...
【问题讨论】:
-
同一个msg_id是什么意思?你有没有做过数据库中唯一的 msg_id 列?
-
这与互斥锁无关,互斥锁用于防止多个线程同时访问共享资源。如果
index被调用两次,这不会阻止代码被执行两次。 -
只需在
msg_id上添加唯一索引,然后在save!上捕获异常(或create!而不是new/save!) -
@user846250 将使用 db 引擎完成,只需使用唯一列,即添加迁移,这将设置列唯一。
-
我做了db中唯一的msg_id列,但它没有使用
标签: ruby-on-rails ruby mutex synchronize