1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Don't refer @transaction_state directly

Since 8180c39, remaining transaction state is cleared in
`force_clear_transaction_record_state` to less work
`sync_with_transaction_state`. But it caused a race condition that
`@transaction_state` would be cleared by other threads if the state is
finalized.

To work as before, snapshot `@transaction_state` to local variable not
to refer `@transaction_state` directly.

Fixes #35983.
This commit is contained in:
Ryuta Kamizono 2019-04-16 08:11:59 +09:00
parent 60afbfffdc
commit f7e126beae

View file

@ -472,13 +472,13 @@ module ActiveRecord
# the TransactionState, and rolls back or commits the Active Record object # the TransactionState, and rolls back or commits the Active Record object
# as appropriate. # as appropriate.
def sync_with_transaction_state def sync_with_transaction_state
if @transaction_state && @transaction_state.finalized? if (transaction_state = @transaction_state)&.finalized?
if @transaction_state.fully_committed? if transaction_state.fully_committed?
force_clear_transaction_record_state force_clear_transaction_record_state
elsif @transaction_state.committed? elsif transaction_state.committed?
clear_transaction_record_state clear_transaction_record_state
elsif @transaction_state.rolledback? elsif transaction_state.rolledback?
force_restore_state = @transaction_state.fully_rolledback? force_restore_state = transaction_state.fully_rolledback?
restore_transaction_record_state(force_restore_state) restore_transaction_record_state(force_restore_state)
clear_transaction_record_state clear_transaction_record_state
end end