Если оно не поднимается, оно совершается.Если вы посмотрите документы, вы заметите, что оператор with более или менее эквивалентен:
connection = engine.connect()
trans = connection.begin()
try:
r1 = connection.execute(table1.select())
connection.execute(table1.insert(), col1=7, col2='this is some data')
trans.commit()
except:
trans.rollback()
raise
Что касается комментария: оператор with не обязательно является заменой для try /за исключением случаев, когда вам нужна обработка исключений - например, когда вы хотите знать, откатана ли транзакция или нет.
Если вам придется выполнить дополнительную очистку или, например, вести журнал при откате транзакции, вы все равнонеобходимо заключить оператор with в попытку / исключение, но вы можете быть уверены, что транзакция была обработана до того, как управление переходит из блока, управляемого оператором with:
try:
with ...:
...
except ...:
# rolled back
else:
# committed
Вы также можетевыберите повторное исправление ошибки, чтобы другие части также могли обработать их.Конечно, например, ведение журнала может быть обработано и другим диспетчером контекста:
from contextlib import contextmanager
@contextmanager
def logger(log, error_msg="Oh woe!"):
try:
yield
except:
log.exception(error_msg)
raise
...
with logger(log), connection.begin():
r1 = connection.execute(table1.select())
connection.execute(table1.insert(), col1=7, col2='this is some data')
В этом случае, как вы заметили в комментарии, попытка / исключение была исключена или скрыта с помощью оператора with, в духе PEP 343 :
Этот PEP добавляет новое выражение "with" в язык Python, чтобы можно было выделить стандартные применения try /наконец, заявления.