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