Using Transactions in Ruby Programs
Problem
You want to perform a transaction in a Ruby DBI script.
Solution
Use the standard DBI transaction support mechanism. Actually, Ruby provides two mechanisms.
Discussion
The Ruby DBI module provides a couple of ways to perform
transactions, although both of them rely on manipulation of
auto-commit mode. One approach uses a begin/rescue block, and you invoke the
commit
and rollback methods
explicitly:
begin
dbh['AutoCommit'] = false
dbh.do("UPDATE money SET amt = amt - 6 WHERE name = 'Eve'")
dbh.do("UPDATE money SET amt = amt + 6 WHERE name = 'Ida'")
dbh.commit
dbh['AutoCommit'] = true
rescue DBI::DatabaseError => e
puts "Transaction failed"
puts "#{e.err}: #{e.errstr}"
begin # empty exception handler in case rollback fails
dbh.rollback
dbh['AutoCommit'] = true
rescue
end
endRuby also supports a transaction method, which is associated with a code block and which commits
or rolls back automatically depending on whether the code block
succeeds or fails:
begin
dbh['AutoCommit'] = false
dbh.transaction do |dbh|
dbh.do("UPDATE money SET amt = amt - 6 WHERE name = 'Eve'")
dbh.do("UPDATE money SET amt = amt + 6 WHERE name = 'Ida'")
end
dbh['AutoCommit'] = true
rescue DBI::DatabaseError => e
puts "Transaction failed"
puts "#{e.err}: #{e.errstr}"
dbh['AutoCommit'] = true
endWith the transaction method,
there is no need to invoke commit
or rollback explicitly yourself.
transaction does raise an exception
if it rolls back, so the example still uses a
begin/rescue ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access