3 phương pháp (1 thất bại) Tôi đã đưa ra là để
1) sử dụng một người quan sát trong lịch sử hoạt động trên tất cả các lưu, xác nhận phương pháp có liên quan
2) để mở ra kỷ lục hoạt động và đặt câu lệnh trình gỡ rối trong đó ROLLBACK được kích hoạt và sau đó chạy caller
để xác định mã đã kích hoạt lỗi.
3) Không thành công: ghi đè các phương thức ghi đang hoạt động và tạm dừng ngoại lệ. Nếu tôi nhớ phương pháp này không bắt bất kỳ ngoại lệ nào vì các phương thức lưu được gói trong một giao dịch.
Ghi chú: Chỉ bật khi chế độ không phải là Rails.env.production ?. Thử nghiệm trên Rails 3.2.13, sử dụng ruby 1.9.3.
1) Observer: http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#observers
class ActiveRecordObserver < ActiveRecord::Observer
observe "ActiveRecord::Base"
def after_validation(model)
debugger if model.errors.messages.any?
Rails.logger.error "after validation"
end
def before_update(model)
debugger if !model.valid?
Rails.logger.error "before update"
end
def after_update(model)
debugger if !model.valid?
Rails.logger.error "after update"
end
def before_save(model)
debugger if model.errors.messages.any?
Rails.logger.error "#{model}" Rails.logger.error "before save"
end
def after_save(model)
debugger if model.errors.messages.any?
Rails.logger.error "after save"
end
end
2) https://github.com/rails/rails/blob/3-1-stable/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb#L231 cd 'bó chương activerecord`
Put a debugger statement when where the rollback is executed.
/Users/<user>/.rvm/gems/ruby-1.9.3-<env>/gems/activerecord-3.2.14/lib/active_record/connection_adapters/abstract/database_statements.rb
196 transaction_open = false
197 decrement_open_transactions
198 if open_transactions == 0
199 rollback_db_transaction
200 debugger
=> 201 rollback_transaction_records(true)
202 else
203 rollback_to_savepoint
204 debugger
205 rollback_transaction_records(false)
Khi máy chủ ray hoặc console lượt truy cập các loại breakpoint trong caller
để có được những vết lùi .
3) Ghi đè AR trong chế độ phát triển. TODO: chỉ ghi đè nếu! Rails.env.production? Đặt này trong app/config/initializers/active_record_or_any_file_name.rb
ActiveRecord::Base.class_eval do
alias_method :old_save, :save
alias_method :old_save!, :save!
def save(*args)
begin
puts "#{self} save"
Rails.logger.info "#{self} save"
old_save(*args)
rescue Exception => e
debugger
puts e
end
end
def save!(*args)
begin
Rails.logger.info "#{self} save!"
puts "#{self} save!"
old_save!(*args)
rescue Exception => e
debugger
puts e
end
end
end
Có gì trong nhật ký xung quanh ROLLBACK? –
Không có lỗi. Ngoài ra, nó là lạ rằng một thời gian nó sử dụng một giao dịch, lần sau nó không. Trừ khi hai mảnh đó không liên quan. – m33lky
Bất kỳ ý tưởng nào gây ra SELECT trong giao dịch? –