aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
diff options
context:
space:
mode:
authorHongli Lai (Phusion) <hongli@phusion.nl>2008-10-09 17:57:49 +0200
committerHongli Lai (Phusion) <hongli@phusion.nl>2008-11-03 20:56:28 +0100
commitfb2325e35855d62abd2c76ce03feaa3ca7992e4f (patch)
tree4864fc83385f6329441b950a83f807a97f59b1e3 /activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
parente916aa7ea1613be966959c05ad41d13fee55a683 (diff)
downloadrails-fb2325e35855d62abd2c76ce03feaa3ca7992e4f.tar.gz
rails-fb2325e35855d62abd2c76ce03feaa3ca7992e4f.tar.bz2
rails-fb2325e35855d62abd2c76ce03feaa3ca7992e4f.zip
Reimplement Jeremy's PostgreSQL automatic transaction state introspection code.
- Fixed compatibility with the old 'postgres' driver which doesn't support transaction state introspection. - Added unit tests for it.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb20
1 files changed, 18 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
index bd434f2efc..a9a63e5a9f 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
@@ -53,6 +53,20 @@ module ActiveRecord
def delete(sql, name = nil)
delete_sql(sql, name)
end
+
+ # Checks whether there is currently no transaction active. This is done
+ # by querying the database driver, and does not use the transaction
+ # house-keeping information recorded by #increment_open_transactions and
+ # friends.
+ #
+ # Returns true if there is no transaction active, false if there is a
+ # transaction active, and nil if this information is unknown.
+ #
+ # Not all adapters supports transaction state introspection. Currently,
+ # only the PostgreSQL adapter supports this.
+ def outside_transaction?
+ nil
+ end
# Runs the given block in a database transaction, and returns the result
# of the block.
@@ -119,7 +133,7 @@ module ActiveRecord
yield
end
rescue Exception => database_transaction_rollback
- if transaction_open
+ if transaction_open && !outside_transaction?
transaction_open = false
decrement_open_transactions
if open_transactions == 0
@@ -131,7 +145,9 @@ module ActiveRecord
raise unless database_transaction_rollback.is_a? ActiveRecord::Rollback
end
ensure
- if transaction_open
+ if outside_transaction?
+ @open_transactions = 0
+ elsif transaction_open
decrement_open_transactions
begin
if open_transactions == 0