aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/transactions.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-04-24 03:46:45 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-04-24 03:58:52 +0900
commitb1458218c95d85c4ce911dd3e99da5ae7cf7aeee (patch)
tree064bba6da679a5ede845a4b1e6ba6301cf0ef54b /activerecord/lib/active_record/transactions.rb
parentaa5e6b590595f76b8c215483aa539503821ac3ff (diff)
downloadrails-b1458218c95d85c4ce911dd3e99da5ae7cf7aeee.tar.gz
rails-b1458218c95d85c4ce911dd3e99da5ae7cf7aeee.tar.bz2
rails-b1458218c95d85c4ce911dd3e99da5ae7cf7aeee.zip
Lazy allocate `@_start_transaction_state`
Diffstat (limited to 'activerecord/lib/active_record/transactions.rb')
-rw-r--r--activerecord/lib/active_record/transactions.rb14
1 files changed, 8 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb
index 49a8206c84..dd6573873e 100644
--- a/activerecord/lib/active_record/transactions.rb
+++ b/activerecord/lib/active_record/transactions.rb
@@ -386,14 +386,15 @@ module ActiveRecord
# Save the new record state and id of a record so it can be restored later if a transaction fails.
def remember_transaction_record_state
- @_start_transaction_state.reverse_merge!(
+ @_start_transaction_state ||= {
id: id,
new_record: @new_record,
destroyed: @destroyed,
attributes: @attributes,
frozen?: frozen?,
- )
- @_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) + 1
+ level: 0
+ }
+ @_start_transaction_state[:level] += 1
remember_new_record_before_last_commit
end
@@ -407,19 +408,20 @@ module ActiveRecord
# Clear the new record state and id of a record.
def clear_transaction_record_state
- @_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) - 1
+ return unless @_start_transaction_state
+ @_start_transaction_state[:level] -= 1
force_clear_transaction_record_state if @_start_transaction_state[:level] < 1
end
# Force to clear the transaction record state.
def force_clear_transaction_record_state
- @_start_transaction_state.clear
+ @_start_transaction_state = nil
@transaction_state = nil
end
# Restore the new record state and id of a record that was previously saved by a call to save_record_state.
def restore_transaction_record_state(force_restore_state = false)
- unless @_start_transaction_state.empty?
+ if @_start_transaction_state
transaction_level = (@_start_transaction_state[:level] || 0) - 1
if transaction_level < 1 || force_restore_state
restore_state = @_start_transaction_state