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