ActiveRecord :: StatementInvalid:PG InFailedSqlTransaction

我正在尝试创建一个ActiveRecord对象。但我在创建它时遇到了这个错误。

(0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is       aborted, commands ignored until end of transaction block

关于这个问题的任何想法。


没有其他答案可以解决问题的根本原因

问题在于,当Postgres引发异常时,它会对同一连接中的未来事务施加毒害。

解决方法是回滚违规事务:

begin
  ActiveRecord...do something...
rescue Exception => e
  puts "SQL error in #{ __method__ }"
  ActiveRecord::Base.connection.execute 'ROLLBACK'

  raise e
end

参见参考。


我有这个问题。 只需重新启动Rails服务器,它应该工作


这个问题发生在我的测试环境中,并且是由于每个测试都被封装在自己的事务中。

我正在使用database_cleaner gem,并且配置它以便在事务中包装测试时不使用javascript。 所以为了解决这个问题,我在每个引起这个问题的规范中增加了js: true 。 (即使认为规范没有实际使用javascript,这是确保测试不会被包含在事务中的最方便的方法,但我相信这样做的方法更少)。

作为参考,这里是来自spec/support/database_cleaner.rb的database_cleaner配置:

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.clean_with :deletion
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :deletion
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end

如果您没有使用database_cleaner,那么测试将被包装在事务中的原因可能是spec/spec_helper.rb中的use_transactional_fixtures选项设置为true 。 尝试将其设置为false。

链接地址: http://www.djcxy.com/p/25833.html

上一篇: ActiveRecord::StatementInvalid: PG InFailedSqlTransaction

下一篇: Catch all exceptions in a rails controller