Синхронный QueryClient с более удобным API #342
Gazizonoki
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Дизайн TQueryClient
Текущий Query Client - это низкоуровневый интерфейс, который дает пользователю TSession и TTxControl для прямого использования, вводит обработку ошибок через TStatus. Это приводит к boilerplate'у у пользователя. Также при синхронном использовании асинхронного API TQueryClient получается колбаса из вызовов функций.
Такой интерфейс может быть актуален в очень высоконагруженных приложениях, где нужен ручной контроль, но большинству пользователей он создает только лишние сложности. Поэтому предлагается:
Сделать синхронный клиент, более дружелюбный к пользователю для решения большинства задач пользователя:
NYdb::NQuerySync::TQueryClient
.Порефакторить текущий API асинхронного клиента, чтобы он тоже был ближе к API синхронного клиента.
В синхронном клиенте:
TDbRequestError
.TRetryHandle
TTxControl
транзакция создается с объектомTTransaction
и действует на протяжении его лайфтайма. (Как в libpqxx)В aсинхронном клиенте:
TTxControl
deprecatedRetryQuery
с клиентом в качестве объекта ретрая deprecatedExecuteQuery()
на клиенте использовать явную сессию из пулаExecuteQuery()
на объекте транзакции{% list tabs %}
Старый клиент
Новый синхронный клиент
Новый асинхронный клиент
{% endlist %}
Один запрос в транзакции (на явной сессии)
При выполнении запроса на синхронном клиенте используется явная сессия из пула, а не посылается запрос с пустым session id (неявная сессия). Такой запрос исполняется в одной транзакции, настройки транзакции (TTxSettings) - опциональный параметр.
{% list tabs %}
Старый клиент
Новый синхронный клиент
{% endlist %}
Асинхронный запрос
При выполнении запроса на асинхронном клиенте теперь также используется явная сессия из пула. Поэтому этап получения сессии можно пропустить. Запрос будет исполнен в 1 транзакции, настройки можно передать через опциональный параметр.
{% list tabs %}
Старый клиент
Новый aсинхронный клиент
{% endlist %}
Ретрай запроса
Раньше ретраить можно было либо на клиенте (неявные сессии), либо на сессии.
В синхронном клиенте теперь ретраи можно делать только через
TRetryHandle
. Это некопируемый и неперемещаемый объект, инициализируется сессией и все запросы перенаправляет в нее.{% list tabs %}
Старый клиент
Новый синхронный клиент
{% endlist %}
Интерактивная транзакция
Для интерактивной транзакции используется объект TTransaction. Он некопируемый и неперемещаемый. Семантика у него такая же, как у транзакции в libpqxx, транзакция активна в переделах скоупа этого объекта. В деструкторе вызывается
Rollback()
. ЕслиRollback()
завершился ошибкой, сессия выкидывается из пула.Сделать коммит можно 2 способами - явный вызов
Commit()
или передав Commit флаг в настройках. Во втором случае в запросе будет переданTTxControl::Tx().Commit()
.Для удобства объект транзакции можно создать вызовом метода
BeginTransaction()
прямо из клиента иTRetryHandle
. ДляBeginTransaction()
можно выставить режим неявного начала транзакции. Тогда в первом запросеExecuteQuery()
будет переданTTxControl::BeginTx()
.BeginTransaction()
можно сделать сразу на клиенте. Тогда будет использована сессия из пула.{% list tabs %}
Старый клиент
Новый синхронный клиент
{% endlist %}
Асинхронная интерактивная транзакция
В отличие от старого клиента, новый будет создавать транзакции только через
BeginTransaction()
. В нем можно выставить режим неявного начала транзакции. Тогда в первом запросеExecuteQuery()
будет переданTTxControl::BeginTx()
. Запросы выполняются через объект транзакции.Сделать коммит можно 2 способами - явный вызов
Commit()
или передав Commit флаг в настройках. Во втором случае в запросе будет переданTTxControl::Tx().Commit()
.BeginTransaction()
можно сделать сразу на клиенте. Тогда будет использована сессия из пула.{% list tabs %}
Старый клиент
Новый асинхронный клиент
{% endlist %}
Ретрай интерактивной транзакции
Для ретрая транзакции используется метод
RetryTransaction()
. В нем пользователю передается в использование сразуTTransaction
. В настройках можно выставить режим неявного начала транзакции. Тогда в первом запросеExecuteQuery()
будет переданTTxControl::BeginTx()
.{% list tabs %}
Старый клиент
Новый синхронный клиент
{% endlist %}
Асинхронный ретрай интерактивной транзакции
Для ретрая транзакции используется метод
RetryTransaction()
. В нем пользователю передается в использование сразуTTransaction
. В настройках можно выставить режим неявного начала транзакции. Тогда в первом запросеExecuteQuery()
будет переданTTxControl::BeginTx()
.{% list tabs %}
Старый клиент
Новый асинхронный клиент
{% endlist %}
Beta Was this translation helpful? Give feedback.
All reactions