diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-04-24 03:46:45 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2019-04-24 03:58:52 +0900 |
commit | b1458218c95d85c4ce911dd3e99da5ae7cf7aeee (patch) | |
tree | 064bba6da679a5ede845a4b1e6ba6301cf0ef54b /activerecord/lib/active_record/transactions.rb | |
parent | aa5e6b590595f76b8c215483aa539503821ac3ff (diff) | |
download | rails-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.rb | 14 |
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 |