2014-12-23 3 views
0

Я хочу сделать атомную транзакцию, а моя база данных - PostgreSQL.Django db transaction set_autocommit и CONN_MAX_AGE

Вот как я делал операцию до сих пор:

transaction.set_autocommit(False) 
try: 
    do_stuff() 
    transaction.commit() 
except: 
    transaction.rollback() 
    raise 
finally: 
    transaction.set_autocommit(True) 

Док говорит, что я мог бы сделать это следующим образом:

with transaction.atomic(): 
    do_stuff() 

ли как код то же самое?

У меня есть пул связи CONN_MAX_AGE=60 в моем settings.py.

Что происходит со следующим сценарием:

  1. первый запрос устанавливает AutoCommit в False
  2. второй запрос делает DB обновления
  3. первый запрос поднимает и исключения, откаты и наборы Autocommit обратно True

Могут ли мои обновления в 2. выжить?

Будет ли отличаться от transaction.atomic()?

ответ

1

Я бы рекомендовал использовать transaction.atomic(), так как его цель - сделать именно то, что вы хотите.

Вы можете увидеть реализацию here. Самое очевидное отличие заключается в том, что версия Django поддерживает «вложенные» транзакции с использованием точек сохранения. Вы можете верить, что этот код хорошо протестирован и широко используется.

Что касается вашего сценария, ваши обновления на шаге 2 должны сохраниться в любом случае, так как autocommit применяется на уровне подключения к базе данных, а два одновременных запроса будут использовать разные соединения с базой данных.

+0

Важным отличием является то, что удаленный внутренний атомный блок может быть отброшен внешним атомным блоком (например, если вы установили ATOMIC_REQUESTS в значение True). – benselme