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:
parent
60afbfffdc
commit
f7e126beae
1 changed files with 5 additions and 5 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue