Skip to content

Instantly share code, notes, and snippets.

@j1n6
Created January 30, 2014 11:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save j1n6/8706563 to your computer and use it in GitHub Desktop.
Save j1n6/8706563 to your computer and use it in GitHub Desktop.
def multi_db_commit(tx_id, dbs)
prepared = []
dbs.each do |db, pr|
db.transaction(:prepare=>tx_id, &pr)
prepared << db
end
rescue
prepared.each do |db|
begin
db.rollback_prepared_transaction(tx_id)
rescue Sequel::DatabaseError
# ...
end
end
else
prepared.each do |db|
begin
db.commit_prepared_transaction(tx_id)
rescue Sequel::DatabaseError
# ...
end
end
end
multi_db_commit('foo', DB1=>proc{...}, DB2=>proc{...}, DB3=>proc{...})
DB1.transaction(:prepare => 'foo')
# ...
end
begin
DB2.transaction(:prepare => 'foo')
# ...
end
begin
DB3.transaction(:prepare => 'foo')
# ...
end
rescue
DB2.rollback_prepared_transaction('foo')
raise
else
end
rescue Sequel::DatabaseError
DB1.rollback_prepared_transaction('foo')
raise
else
DB1.commit_prepared_transaction('foo')
DB2.commit_prepared_transaction('foo')
DB3.commit_prepared_transaction('foo')
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment