2012-02-15 65 views
4

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

在旧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 

我无法找到的文档太多 - 如何同与mysql2做了什么?

回答

2

这个问题让我很好奇,所以我找到了Ruby on Rails的如何处理事务,我发现this code

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 

您是否尝试过执行在你的其他语句begincommit声明?

client.query('begin') 

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

client.query('commit') 
7

我只是做了实现:

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 

所以,你可以使用这样的:

DBConnector.transaction do 
    # your db queries here 
end 
0

使用布鲁诺的模板,然后将交易状态指示灯:

def transaction(&block) 
    raise ArgumentError, "No block was given" unless block_given? 
    begin 
     raw_query("BEGIN") 
     yield 
     raw_query("COMMIT") 
     return true # Successful Transaction 
    rescue 
     raw_query("ROLLBACK") 
     return false # Failed Transaction 
    end 
end 

互动与#交易:

def run_queries(queries) 
    raise ArgumentError, "Invalid Queries Argument: #{queries}" unless queries.respond_to?(:each) 
    success = transaction do 
     queries.each do |q| 
      raw_query(q) 
     end 
    end 
    raise RuntimeError, "Transaction Failed for Queries: #{queries}" unless success 
end