> Помогает ли транзакция с уровнем изоляции сериализации при race condition? (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: HeadHunter

Стек: Python

> Пример ответа

Да, транзакция с уровнем изоляции сериализации (SERIALIZABLE) помогает при race condition, но с оговорками. В этом режиме СУБД гарантирует, что параллельные транзакции выполняются так, как если бы они шли последовательно, одна за другой. Это предотвращает аномалии, такие как потерянные обновления, грязное чтение и фантомы, которые часто являются причиной race condition.

Однако в Python (например, с PostgreSQL через psycopg2) сериализация не решает все проблемы автоматически. Она может приводить к ошибкам сериализации (например, serialization_failure в PostgreSQL), которые требуют повторной попытки транзакции. Кроме того, из-за блокировок и проверок производительность падает, особенно при высокой конкуренции.

Пример: если два процесса одновременно читают и обновляют баланс счета, сериализация заставит одну транзакцию откатиться, если обнаружит конфликт. Но код должен явно обрабатывать повторные попытки:

PYTHON
import psycopg2
from psycopg2.extras import RealDictCursor
def transfer_money(from_id, to_id, amount):
conn = psycopg2.connect("dbname=test")
conn.set_session(isolation_level='SERIALIZABLE')
try:
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute("SELECT balance FROM accounts WHERE id = %s", (from_id,))
from_balance = cur.fetchone()['balance']
if from_balance < amount:
raise ValueError("Insufficient funds")
cur.execute("UPDATE accounts SET balance = balance - %s WHERE id = %s", (amount, from_id))
cur.execute("UPDATE accounts SET balance = balance + %s WHERE id = %s", (amount, to_id))
conn.commit()
except psycopg2.errors.SerializationFailure:
conn.rollback()
# Повторная попытка
transfer_money(from_id, to_id, amount)
finally:
conn.close()

Таким образом, сериализация - мощный инструмент, но требует правильной обработки ошибок и может быть избыточной для простых сценариев, где достаточно более низких уровней изоляции (например, READ COMMITTED с явными блокировками).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью