我正在尝试使用悲观锁来避免出现竞争状况。我期望一个线程通过获取另一行后SELECT FOR UPDATE,寻找同一行的另一个线程将被阻塞,直到释放锁为止。但是,经过测试,似乎锁没有保持住,并且即使第一个线程尚未保存(更新)该行,第二个线程也只能获取该行并对其进行更新。
以下是相关代码:
数据库架构
class CreateMytables < ActiveRecord::Migration
def change
create_table :mytables do |t|
t.integer :myID
t.integer :attribute1
t.timestamps
end
add_index :mytables, :myID, :unique => true
end
end
Run Code Online (Sandbox Code Playgroud)
mytables_controller.rb
class MytablessController < ApplicationController
require 'timeout'
def create
myID = Integer(params[:myID])
begin
mytable = nil
Timeout.timeout(25) do
p "waiting for lock"
mytable = Mytables.find(:first, :conditions => ['"myID" = ?', myID], :lock => true ) #'FOR UPDATE NOWAIT') #true)
#mytable.lock!
p "acquired lock"
end
if mytable.nil?
mytable = Mytables.new …Run Code Online (Sandbox Code Playgroud)