【问题标题】:In rails3/jruby, what could cause this error intermittently? SAVEPOINT active_record_1 does not exist在 rails3/jruby 中,什么可能会导致此错误间歇性出现? SAVEPOINT active_record_1 不存在
【发布时间】:2023-04-04 21:28:01
【问题描述】:

当一个人测试系统时不会发生这些错误。但是通过 jmeter 测试,我可以非常可靠地重现以下错误:

ActiveRecord::JDBCError: SAVEPOINT active_record_1 does not exist: ROLLBACK TO SAVEPOINT active_record_1

Stack:

    gems/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract_adapter.rb:207:in `log'
    gems/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract_adapter.rb:200:in `log'
    gems/gems/activerecord-jdbc-adapter-1.2.1/lib/arjdbc/jdbc/adapter.rb:208:in `execute'
    gems/gems/activerecord-jdbc-adapter-1.2.1/lib/arjdbc/mysql/adapter.rb:156:in `rollback_to_savepoint'
    gems/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract/database_statements.rb:179:in `transaction'
    gems/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract/database_statements.rb:171:in `transaction'
    gems/gems/activerecord-3.0.10/lib/active_record/transactions.rb:207:in `transaction'
    gems/gems/activerecord-3.0.10/lib/active_record/transactions.rb:290:in `with_transaction_returning_status'
    gems/gems/activerecord-3.0.10/lib/active_record/transactions.rb:240:in `save'
    gems/gems/activerecord-3.0.10/lib/active_record/transactions.rb:251:in `rollback_active_record_state!'
    gems/gems/activerecord-3.0.10/lib/active_record/transactions.rb:239:in `save'
    ...(our code that simply calls save on a new instance of a model class)...

我们没有嵌套事务,甚至没有显式使用它们。我发现围绕此错误消息的一个现有错误,但它不相关;我们不会截断或做任何 DDL 工作。只需创建记录并保存即可。

我们使用 Rails 3.0.10、JRuby 1.6.5、activerecord-jdbcmysql-adapter、Warbler 1.3.2 并通过 Elastic Beanstalk 部署在具有单个 Mysql 实例 v5.1.57 的 64 位 Tomcat 7/Amazon RDS 上.我们为 config.threadsafe 做好了准备! - 这感觉就像是 ActiveRecord 内部的某种竞赛 - 但是 ActiveRecord 应该在线程安全中工作,不是吗?

最后一点:我担心这是 JRuby 或 Warbler 问题,因为如果我们从 JRuby 切换到 MRI Ruby 1.9,我们将无法重现此问题。

【问题讨论】:

  • 这听起来很愚蠢,但是当我用完磁盘空间时,我遇到了这个错误。 test.log 显示 SAVEPOINT active_record_1, INSERT INTO ... => SQLite3::FullException: database or disk is full, ROLLBACK TO SAVEPOINT active_record_1 => SQLite3::SQLException: no such savepoint。 (原因是 /tmp 中累积了陈旧的 Selenium 数据。)

标签: ruby ruby-on-rails-3 jruby warbler amazon-elastic-beanstalk


【解决方案1】:

可能与 1.2.1 中引入的this commit 相关。 1.2.0 是否给您同样的问题?

也许我需要对支持的事务和失败的事务重新引入一些错误检查。愿意在https://github.com/jruby/activerecord-jdbc-adapter/issues 提交错误吗?谢谢。

【讨论】:

  • 不幸的是,尽管花费了莫名其妙的时间,但即使使用 1.2.0 activerecord-jdbc-adapter,我也重现了这一点。我会更新错误。我对最终得到这个结果并不感到惊讶——我不清楚异常处理的变化是如何导致创建保存点的。
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多