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)
这个问题让我很好奇,所以我追踪了 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)
| 归档时间: |
|
| 查看次数: |
6269 次 |
| 最近记录: |