2013-02-13 28 views
5

Tôi đang hợp nhất một số thay đổi đối với ứng dụng Rails của tôi, bao gồm việc thêm gem gem delay_job (trông rất tuyệt). Để kiểm tra nó ra, tôi:công việc cào: công việc cho "PGError: ERROR: SELECT FOR UPDATE/SHARE không được phép trong các truy vấn phụ"

  • chạy rails g delayed_job
  • chạy rake db:migrate, mà tạo ra bảng delayed_jobs
  • khởi động lại rails server (chỉ trong trường hợp)
  • khởi động lại dịch vụ postgresql (chỉ trong trường hợp)
  • chạy scripts/delayed_job start
  • thực hiện một số tác vụ để tích luỹ các công việc bị trì hoãn

Nhưng không có gì xảy ra:/Công việc của tôi nằm trong bảng công việc bị trì hoãn, nhưng locked_at là null (Như là last_error).

Vì vậy, tôi đã cố gắng rake jobs:work, mà đã đưa ra một lỗi lạ Postgres:
PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries và một dấu vết:

$ rake jobs:work 
[Worker(host:robert-vaio pid:21217)] Starting job worker 
rake aborted! 
PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries 
: UPDATE "delayed_jobs" SET locked_at = '2013-02-13 19:53:46.803085', locked_by = 'host:robert-vaio pid:21217' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at <= '2013-02-13 19:53:46.792619' AND (locked_at IS NULL OR locked_at < '2013-02-13 15:53:46.792639') OR locked_by = 'host:robert-vaio pid:21217') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1153:in `async_exec' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1153:in `exec_no_cache' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `block in exec_query' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:661:in `exec_query' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1248:in `select' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/database_statements.rb:18:in `select_all' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/querying.rb:38:in `block in find_by_sql' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/explain.rb:33:in `logging_query_plan' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/querying.rb:37:in `find_by_sql' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job_active_record-0.4.1/lib/delayed/backend/active_record.rb:63:in `reserve' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:258:in `reserve_and_run_one_job' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:187:in `block in work_off' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:186:in `times' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:186:in `work_off' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:151:in `block (4 levels) in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:150:in `block (3 levels) in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:149:in `block (2 levels) in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:148:in `loop' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:148:in `block in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/plugins/clear_locks.rb:7:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in <class:ClearLocks>' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `block (2 levels) in add' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `block in add' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:147:in `start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/tasks.rb:9:in `block (2 levels) in <top (required)>' 
Tasks: TOP => jobs:work 
(See full trace by running task with --trace) 

tôi không thể tìm ra những gì là sai - và đáng ngạc nhiên hơn, tôi có thể tìm thấy bất cứ ai khác đặt câu hỏi này ....!

Cảm ơn bạn đã trợ giúp!

+0

Câu chuyện dài ngắn - Tôi đã nâng cấp lên postgres 9.1 và lỗi đã biến mất. – rmosolgo

Trả lời

5

Cập nhật postgres đã khắc phục sự cố cho tôi - và điều đó dường như thích hợp hơn để khóa lại phiên bản cũ. Không phải là đây là câu trả lời của tôi của tôi, nhưng như rmosolgo đã trả lời câu hỏi của riêng mình, có vẻ như câu hỏi này có thể đi đúng vào trạng thái 'câu trả lời được chấp nhận'.

+0

Phiên bản Postgres nào bạn nâng cấp lên làm cho nó hoạt động? – Jonah

+1

9.2.4 có thể. Đó là những gì tôi đang làm và tôi không nhớ nâng cấp kể từ đó. Tôi có lẽ cũng nên lưu ý rằng tôi đang chạy nó trên Windows. (hoàn cảnh của công ty ...) – elc

6

Tôi gặp vấn đề tương tự. Tôi giải quyết điều này bằng cách khóa Gemfile tôi cho delayed_job_active_record lên phiên bản 0.3.3:

đá quý 'delayed_job_active_record', '0.3.3'

Các đá quý không làm việc được phiên bản 0.4.1, được phát hành vào ngày 12 tháng 2 , 2012.

+0

Tôi có thể xác nhận giải pháp này.Gem 'delay_job_active_record' phiên bản 4.0.0 và 0.4.4 hiển thị hành vi lỗi, nhưng phiên bản gem 0.3.3 hoạt động chính xác. Tôi đang sử dụng PostgresSQL 8.3.7. – Ichimonji10

+0

Điều tuyệt vời phù hợp với tôi. Bạn đã tiết kiệm rất nhiều thời gian của tôi. –

+0

Để sử dụng "delay_job_active_record" của phiên bản 0.3.3, nó cần phiên bản active_record < 4.0 & > 2.1.Tôi đang sử dụng Rails4. Bất kỳ ý tưởng khác thay thế xin vui lòng ... – Prem

2

Đây là vấn đề bí quyết cho delayed_job, xem https://github.com/collectiveidea/delayed_job_active_record/issues/33

Có một chi nhánh của delayed_job_active_record mà hoạt động tốt với postgres 8.4 và tương thích với đường ray 4.x

gem 'delayed_job_active_record', :git => '[email protected]:panter/delayed_job_active_record.git' 

Nó sửa chữa vấn đề bằng cách sử dụng các cuộc gọi sql postgres mà không có các truy vấn không thành công.

1

Tôi đã thử với giải pháp cung cấp bt Neil Woods nhưng nó đã được hiển thị một số vấn đề xác thực sau đó tôi đã thử thêm với dòng dưới đây với những thay đổi nhỏ trong cùng một.

gem 'delayed_job_active_record', :git => 'git://github.com/panterch/delayed_job_active_record.git' 

Làm việc này, hãy thử điều này nếu có ai gặp vấn đề tương tự.

Cảm ơn.

Các vấn đề liên quan