Skip to content

Commit

Permalink
Merge pull request rails#16341 from arthurnn/transactions_remove_begin
Browse files Browse the repository at this point in the history
Transactions refactoring - 2
  • Loading branch information
rafaelfranca committed Jul 31, 2014
2 parents ed9b23d + 4140797 commit 8888296
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def initialize(connection)

def begin_transaction(options = {})
transaction_class = @stack.empty? ? RealTransaction : SavepointTransaction
transaction = transaction_class.new(@connection, current_transaction, options)
transaction = transaction_class.new(@connection, "active_record_#{@stack.size}", options)

@stack.push(transaction)
transaction
Expand Down Expand Up @@ -50,22 +50,18 @@ def current_transaction
private

def closed_transaction
@closed_transaction ||= ClosedTransaction.new(@connection)
@closed_transaction ||= ClosedTransaction.new
end
end

class Transaction #:nodoc:
attr_reader :connection
attr_reader :connection, :state

def initialize(connection)
@connection = connection
@state = TransactionState.new
end

def state
@state
end

def savepoint_name
nil
end
Expand Down Expand Up @@ -102,64 +98,35 @@ def set_state(state)
end

class ClosedTransaction < Transaction #:nodoc:
def number
0
end

def begin(options = {})
RealTransaction.new(connection, self, options)
end

def closed?
true
end

def open?
false
end

def joinable?
false
end

def initialize; super(nil); end
def closed?; true; end
def open?; false; end
def joinable?; false; end
# This is a noop when there are no open transactions
def add_record(record)
end
def add_record(record); end
end

class OpenTransaction < Transaction #:nodoc:
attr_reader :parent, :records
attr_reader :records
attr_writer :joinable

def initialize(connection, parent, options = {})
def initialize(connection, options = {})
super connection

@parent = parent
@records = []
@joinable = options.fetch(:joinable, true)
end


def joinable?
@joinable
end

def number
parent.number + 1
end

def begin(options = {})
SavepointTransaction.new(connection, self, options)
end

def rollback
perform_rollback
parent
end

def commit
perform_commit
parent
end

def add_record(record)
Expand All @@ -174,7 +141,7 @@ def rollback_records
@state.set_state(:rolledback)
records.uniq.each do |record|
begin
record.rolledback!(parent.closed?)
record.rolledback!(self.is_a?(RealTransaction))
rescue => e
record.logger.error(e) if record.respond_to?(:logger) && record.logger
end
Expand Down Expand Up @@ -202,8 +169,8 @@ def open?
end

class RealTransaction < OpenTransaction #:nodoc:
def initialize(connection, parent, options = {})
super
def initialize(connection, _, options = {})
super(connection, options)

if options[:isolation]
connection.begin_isolated_db_transaction(options[:isolation])
Expand All @@ -226,26 +193,23 @@ def perform_commit
class SavepointTransaction < OpenTransaction #:nodoc:
attr_reader :savepoint_name

def initialize(connection, parent, options = {})
def initialize(connection, savepoint_name, options = {})
if options[:isolation]
raise ActiveRecord::TransactionIsolationError, "cannot set transaction isolation in a nested transaction"
end

super

# Savepoint name only counts the Savepoint transactions, so we need to subtract 1
@savepoint_name = "active_record_#{number - 1}"
connection.create_savepoint(@savepoint_name)
super(connection, options)
connection.create_savepoint(@savepoint_name = savepoint_name)
end

def perform_rollback
connection.rollback_to_savepoint(@savepoint_name)
connection.rollback_to_savepoint(savepoint_name)
rollback_records
end

def perform_commit
@state.set_state(:committed)
connection.release_savepoint(@savepoint_name)
connection.release_savepoint(savepoint_name)
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions activerecord/test/cases/transactions_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,7 @@ def test_sqlite_add_column_in_transaction

def test_transactions_state_from_rollback
connection = Topic.connection
transaction = ActiveRecord::ConnectionAdapters::ClosedTransaction.new(connection).begin
transaction = ActiveRecord::ConnectionAdapters::TransactionManager.new(connection).begin_transaction

assert transaction.open?
assert !transaction.state.rolledback?
Expand All @@ -560,7 +560,7 @@ def test_transactions_state_from_rollback

def test_transactions_state_from_commit
connection = Topic.connection
transaction = ActiveRecord::ConnectionAdapters::ClosedTransaction.new(connection).begin
transaction = ActiveRecord::ConnectionAdapters::TransactionManager.new(connection).begin_transaction

assert transaction.open?
assert !transaction.state.rolledback?
Expand Down

0 comments on commit 8888296

Please sign in to comment.