如何使用ruby mysql2执行事务

sa1*_*125 5 ruby transactions batch-processing mysql2

我开始使用mysql2宝石了.我试图找出一些基本的东西 - 其中之一是如何显式执行事务(对于批处理操作,如多个INSERT/UPDATE查询).

在旧的ruby-mysql,这是我的方法:

client  = Mysql.real_connect(...)
inserts = [
  "INSERT INTO ...",
  "UPDATE .. WHERE id=..",
  # etc
]

client.autocommit(false)
inserts.each do |ins|  
  begin
    client.query(ins)
  rescue
    # handle errors or abort entirely
  end
end
client.commit
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到多少 - 如何才能完成同样的工作mysql2

小智 9

我刚刚做了一个实现:

class DBConnector
  def transaction(&block)
    raise ArgumentError, "No block was given" unless block_given?
    begin
      client.query("BEGIN")
      yield
      client.query("COMMIT")
    rescue
      client.query("ROLLBACK")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所以你可以像这样使用:

DBConnector.transaction do
  # your db queries here
end
Run Code Online (Sandbox Code Playgroud)


Mic*_*ley 2

这个问题让我很好奇,所以我追踪了 Ruby on Rails 如何处理事务,我发现了这段代码

def begin_db_transaction
  execute "BEGIN"
rescue Exception
  # Transactions aren't supported
end

def commit_db_transaction #:nodoc:
  execute "COMMIT"
rescue Exception
  # Transactions aren't supported
end

def rollback_db_transaction #:nodoc:
  execute "ROLLBACK"
rescue Exception
  # Transactions aren't supported
end
Run Code Online (Sandbox Code Playgroud)

您是否尝试过在其他语句周围执行beginand语句?commit

client.query('begin')

inserts.each do |ins|  
  begin
    client.query(ins)
  rescue
    client.query('rollback')
    return
  end
end

client.query('commit')
Run Code Online (Sandbox Code Playgroud)