Skip to content

Instantly share code, notes, and snippets.

@royaltm
Created October 9, 2014 02:24
Show Gist options
  • Save royaltm/1fe67dd0db76108f4a41 to your computer and use it in GitHub Desktop.
Save royaltm/1fe67dd0db76108f4a41 to your computer and use it in GitHub Desktop.
ruby-pg-em connection pool deferred transaction example
#!/bin/env ruby
require 'pg/em/connection_pool'
# psql test <<EOF
# CREATE TABLE bar (
# key integer,
# value character varying
# );
# EOF
EM.run do
pool = PG::EM::ConnectionPool.new(size: 5, lazy: true, dbname: 'test')
pool.query_defer('DELETE FROM bar').callback do
timer = EM.add_periodic_timer(0.2) do
pool.query_defer("SELECT * FROM bar WHERE key = 69").callback do |res|
puts res.to_a.inspect
end.errback {|ex| raise ex }
end
EM.add_timer(2) do
pool.__send__(:hold_deferred) do |conn|
EM::DefaultDeferrable.new.tap do |df|
rollback = proc do |ex|
conn.query_defer("ROLLBACK") { df.fail(ex) }
end
conn.query_defer("BEGIN").callback do
conn.query_defer("INSERT INTO bar (key,value) VALUES (69,'foo')").callback do
conn.query_defer("UPDATE bar SET value = 'xyz' WHERE key = 69").callback do
conn.query_defer("COMMIT").callback { df.succeed }.errback(&rollback)
end.errback(&rollback)
end.errback(&rollback)
end.errback {|ex| df.fail(ex) }
end
end.callback do
puts "transaction commit good"
EM.add_timer(2) { EM.cancel_timer timer; EM.stop }
end.errback do |ex|
puts "transaction failed"
EM.add_timer(2) { raise ex }
end
end
end.errback do |ex|
raise ex
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment