3 방법론 (1 실패)이며, ROLLBACK이 트리거 된 디버거 문을 넣은 다음 caller
을 실행하여 오류를 트리거 한 코드를 찾아냅니다.
3) 실패 : 활성 레코드 메서드를 무시하고 예외가 발생하면 일시 중지합니다. 저장 메소드가 트랜잭션에 랩핑되어 있기 때문에이 메소드가 예외를 포착하지 않는다는 것을 기억합니다.
참고 : 모드가 Rails.env.production?이 아닌 경우에만 활성화하십시오. Ruby 1.9.3을 사용하여 Rails 3.2.13에서 테스트되었습니다.
1) 관찰자 :
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)
레일 서버 또는 콘솔을 역 추적을 얻을 수 caller
에 중단 점 유형 안타 activerecord` 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`번들 쇼 .
3) 개발 모드에서 AR을 덮어 씁니다. TODO : 경우에만 재정의! Rails.env.production? 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
ROLLBACK 주변의 로그는 무엇입니까? –
오류가 없습니다. 또한 다음 번에는 트랜잭션을 사용하지 않는 것이 이상한 일입니다. 그 두 조각이 무관하지 않다면 말이지. – m33lky
트랜잭션 내부에서 SELECT가 원인이되는 것은 무엇입니까? –