aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2012-09-14 19:06:02 +0100
committerJon Leighton <j@jonathanleighton.com>2012-09-15 00:00:50 +0100
commit280587588aba6ce13717cd6679e3f2b43d287443 (patch)
treea2f2593a46c7f704a56088be5fd2cd4ab7e90ded /activerecord
parenta6fbddb7be5095186e7d66aac0ef64e46b7284f9 (diff)
downloadrails-280587588aba6ce13717cd6679e3f2b43d287443.tar.gz
rails-280587588aba6ce13717cd6679e3f2b43d287443.tar.bz2
rails-280587588aba6ce13717cd6679e3f2b43d287443.zip
Move transaction joinability into the transaction object
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb26
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/transaction.rb9
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_adapter.rb7
-rw-r--r--activerecord/lib/active_record/fixtures.rb5
-rw-r--r--activerecord/test/cases/transactions_test.rb9
5 files changed, 36 insertions, 20 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 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
diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb
index b4ac2f8830..9ab2bddeb2 100644
--- a/activerecord/test/cases/transactions_test.rb
+++ b/activerecord/test/cases/transactions_test.rb
@@ -581,5 +581,14 @@ if current_adapter?(:PostgreSQLAdapter)
assert_equal original_salary, Developer.find(1).salary
end
+
+ test "#transaction_joinable= is deprecated" do
+ Developer.transaction do
+ conn = Developer.connection
+ assert conn.current_transaction.joinable?
+ assert_deprecated { conn.transaction_joinable = false }
+ assert !conn.current_transaction.joinable?
+ end
+ end
end
end