Привет.
Я не очень шарю в БД, и не понимаю в чем отличие
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?