AgeofCreations
@AgeofCreations
Python, AsyncIO, AMQP

В чем отличие asyncpg.Connection.transaction и asyncpg.Connection.acquire?

Привет.

Я не очень шарю в БД, и не понимаю в чем отличие transaction() от acquire()

Судя по документации asyncpg, acquire() позволяет забрать подключение из пула(который создается заранее),
выполнить некоторый код, а затем вернуть его обратно в пул.

Но что тогда делает transaction()?
Ну то есть я понимаю, что он открывает транзакцию. Но что нам это дает? Что мы можем сделать rollback, а acquire() записывает напрямую, без обертки в транзакцию?

Оба они используются следующим образом:
async with pool.transaction() as conn:
ИЛИ 
async with pool.acquire() as conn:
  result = conn.fetch(query)
  <or any code i want to execute>

И вроде как, в моем коде они взаимозаменяемы. То есть, работает и так, и так. (Почему я собственно и полез разбираться, но так исчерпывающего ответа и не нашел)

Ну и еще я знаю, что транзакция оборачивает запрос вBEGIN;, COMMIT;.

Быть может, acquire() стоит использовать для read-only, а transaction() для create-update-delete?
  • Вопрос задан
  • 1493 просмотра
Решения вопроса 1
@slep0v
Это ортагональные вещи:

acquire() позволяет достать соединение из пула.

transaction() используется для обертки и выполнения нескольких запросов как единое целое (обратите внимание на использование внутри context-manager).

Если возникает ошибка посередине транзакции, то к предыдущим командам применяется rollback и никаких изменений не происходит по итогу.

Если нужно выполнять команды по одной, достаточно использовать connection из `pool.acquire`.

При этом `transaction` можно вызывать из `connection`:

async with pool.acquire() as connection:
    async with connection.transaction():
        # Write operation
        await connection.execute('INSERT INTO mytable (col1) VALUES ($1)', 123)
        # Read operation
        result = await connection.fetch('SELECT * FROM mytable WHERE col1 = $1', 123)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы