From 280587588aba6ce13717cd6679e3f2b43d287443 Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Fri, 14 Sep 2012 19:06:02 +0100 Subject: Move transaction joinability into the transaction object --- .../abstract/database_statements.rb | 26 +++++++++++----------- .../connection_adapters/abstract/transaction.rb | 9 +++++++- .../connection_adapters/abstract_adapter.rb | 7 +++--- activerecord/lib/active_record/fixtures.rb | 5 ++--- 4 files changed, 27 insertions(+), 20 deletions(-) (limited to 'activerecord/lib') 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 1ff46a57eb..dd379446e9 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb @@ -3,8 +3,7 @@ module ActiveRecord module DatabaseStatements def initialize super - @transaction_joinable = nil - @transaction = ClosedTransaction.new(self) + @transaction = ClosedTransaction.new(self) end # Converts an arel AST to SQL @@ -173,14 +172,11 @@ module ActiveRecord def transaction(options = {}) options.assert_valid_keys :requires_new, :joinable - last_transaction_joinable = @transaction_joinable - @transaction_joinable = options.fetch(:joinable, true) - requires_new = options[:requires_new] || !last_transaction_joinable - transaction_open = false + transaction_open = false begin - if @transaction.closed? || requires_new - begin_transaction + if options[:requires_new] || !current_transaction.joinable? + begin_transaction(options) transaction_open = true end @@ -195,11 +191,9 @@ module ActiveRecord end ensure - @transaction_joinable = last_transaction_joinable - if outside_transaction? @transaction = ClosedTransaction.new(self) - elsif @transaction.open? && transaction_open + elsif current_transaction.open? && transaction_open begin commit_transaction rescue Exception @@ -209,12 +203,18 @@ module ActiveRecord end end - def transaction_state #:nodoc: + def current_transaction #:nodoc: @transaction end - def begin_transaction #:nodoc: + def transaction_open? + @transaction.open? + end + + def begin_transaction(options = {}) #:nodoc: @transaction = @transaction.begin + @transaction.joinable = options.fetch(:joinable, true) + @transaction end def commit_transaction #:nodoc: diff --git a/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb index f456ecae66..1d0b3eb612 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb @@ -25,13 +25,20 @@ module ActiveRecord false end + def joinable? + false + end + # This is a noop when there are no open transactions def add_record(record) end end class OpenTransaction < Transaction #:nodoc: - attr_reader :parent, :records + attr_reader :parent, :records + attr_accessor :joinable + + alias joinable? joinable def initialize(connection, parent) super connection diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 11c6e76b0d..fd086fd47d 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -247,15 +247,16 @@ module ActiveRecord end def increment_open_transactions - ActiveSupport::Deprecation.warn "increment_open_transactions is deprecated and has no effect" + ActiveSupport::Deprecation.warn "#increment_open_transactions is deprecated and has no effect" end def decrement_open_transactions - ActiveSupport::Deprecation.warn "decrement_open_transactions is deprecated and has no effect" + ActiveSupport::Deprecation.warn "#decrement_open_transactions is deprecated and has no effect" end def transaction_joinable=(joinable) - @transaction_joinable = joinable + ActiveSupport::Deprecation.warn "#transaction_joinable= is deprecated. Please pass the :joinable option to #begin_transaction instead." + @transaction.joinable = joinable end def create_savepoint diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb index 1f72442832..60fc653735 100644 --- a/activerecord/lib/active_record/fixtures.rb +++ b/activerecord/lib/active_record/fixtures.rb @@ -843,8 +843,7 @@ module ActiveRecord end @fixture_connections = enlist_fixture_connections @fixture_connections.each do |connection| - connection.begin_transaction - connection.transaction_joinable = false + connection.begin_transaction joinable: false end # Load fixtures for every test. else @@ -867,7 +866,7 @@ module ActiveRecord # Rollback changes if a transaction is active. if run_in_transaction? @fixture_connections.each do |connection| - connection.rollback_transaction if connection.transaction_state.open? + connection.rollback_transaction if connection.transaction_open? end @fixture_connections.clear end -- cgit v1.2.3