AgeofCreations
@AgeofCreations
Hardware, SEO.

В чем отличие 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?
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
@bacon
Смешались в кучу кони, люди

1. acquire - это получение коннекта
2. transaction - это обеспечение атомарности для нескольких операций (причем только операций создания и изменения), сравнивать это с acquire, тоже самое что и теплое с мягким. Ну и без получения коннекта, вы не сможете начать transaction, да и просто запросы к базе не сделаете.
3. "with pool.transaction() OR pool.acquire() as conn:" это вообще воспаление мозга
4. asyncpg асинхронная библиотека, тут минимум async with
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы