【问题标题】:SQLite3 BusyException during update更新期间的 SQLite3 BusyException
【发布时间】:2012-12-15 06:39:09
【问题描述】:

我很难更新数据库中的信息。最初,当我尝试保存更改时,它给了我数据库被锁定的错误。

SQLite3::BusyException: cannot rollback transaction - SQL statements in progress: rollback transaction

这里是有问题的守护进程:

require 'daemons'
require File.expand_path(
File.join(File.dirname(__FILE__), '..', 'config', 'environment'))

Daemons.run_proc('clock.rb')do
  daemon_log = ActiveSupport::BufferedLogger.new(
     File.join(Rails.root, "log", "clock.log"))
  Rails.logger = ActiveRecord::Base.logger = daemon_log
  Rails.logger = ActiveRecord::Base.logger.info("running clock.rb")
  Rails.logger = ActiveRecord::Base.logger.info("Information Retrieved")
  UserStats = UgloungeSkills.find(:all)

  loop do

    Rails.logger = ActiveRecord::Base.logger.info("running main loop")
    UserStats.each do |row|
      powerLevel = row['taming'] + row['mining'] + row['woodcutting'] + row['repair'] + row['unarmed'] + row['herbalism'] + row['excavation'] + row['archery'] + row['swords'] + row['axes'] + row['acrobatics'] + row['fishing']
      userName = UgloungeUser.find(row['user_id'])['user']
      McMMO_id = row['user_id']

      if(User.exists?(name: userName))
        #Update it
        singleUser = User.find(McMMO_id)
        Rails.logger = ActiveRecord::Base.logger.info("Just updating information")
        Rails.logger = ActiveRecord::Base.logger.info("User: " + singleUser['name'])
        #Rails.logger = ActiveRecord::Base.logger.info("Values of power_level and McMMO_id: " + powerLevel)
        singleUser.name = "Poopyhead"
        singleUser.save
        #singleUser.update_attributes(power_level: powerLevel, mcmmo_id: McMMO_id)
        Rails.logger = ActiveRecord::Base.logger.info("Finished updating")

      else
        #Create a new user
        Rails.logger = ActiveRecord::Base.logger.info("Creating new user")

        User.create(name: userName, power_level: powerLevel, mcmmo_id: McMMO_id)
      end
    end
    sleep(120)
    Rails.logger = ActiveRecord::Base.logger.info("Sleeping")
  end
end

我只是使用 sqlite 来存储一些信息,另一个数据库是 MySQL 数据库,它只是被读取。非常感谢任何帮助。

【问题讨论】:

    标签: sql ruby-on-rails ruby ruby-on-rails-3 sqlite


    【解决方案1】:

    这听起来像是我最近在一个项目中遇到的问题。 SQLite 在开发和 beta 测试中表现出色,但在生产环境的压力下,整个事情都崩溃了。我正在将项目转换为不同的架构(Resque),到目前为止性能更好,我计划下周部署新架构。至少,您应该转换为 MySQL 以避免这些错误。

    【讨论】:

    • 奇怪的是,我正计划使用 MySQL 进行生产。我认为 SQLite 会更简单,也许对于我存储的少量数据更好。
    • 是的,当您有多个进程访问数据库时,您最终可能会被这些锁阻塞。如果你真的要处理少量的数据,你可以尝试修改 database.yml 为你的 sqlite 环境设置超时,比如timeout: 1000
    • 我相信 Rails 默认会超时。我的设置为 5000。我宁愿将数据库保持在本地,而不必与 MySQL 混为一谈。
    猜你喜欢
    • 2010-09-09
    • 2012-07-02
    • 2011-08-24
    • 1970-01-01
    • 2013-11-13
    • 2017-02-07
    • 1970-01-01
    • 2015-06-05
    • 2020-12-19
    相关资源
    最近更新 更多