小编S.Y*_*han的帖子

SELECT FOR UPDATE在PostgreSQL 9.1的Rails 3.2.11上不会阻塞

我正在尝试使用悲观锁来避免出现竞争状况。我期望一个线程通过获取另一行后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)

activerecord locking ruby-on-rails-3 postgresql-9.1

4
推荐指数
1
解决办法
3186
查看次数