ydb-platform / ydb-r2dbc-driver

YDB R2DBC Driver
Apache License 2.0
3 stars 1 forks source link

Implement Connection and transaction flow #11

Closed Kuleshovegor closed 6 months ago

Kuleshovegor commented 7 months ago

Implement io.r2dbc.spi.Connection interface and transaction flow.

Kuleshovegor commented 7 months ago

image

В предложенном мною решении выделяю класс QueryExecutor, который отвечает за выполнение запросов к YDB, основной список его методов это:

  1. Flux executeDataQuery(String yql, Params params, ListoperationTypes);
  2. Flux executeSchemaQuery(String yql);
  3. Mono beginTransaction();
  4. Mono beginTransaction(YdbTxSettings ydbTxSettings);
  5. Mono commitTransaction();
  6. Mono rollbackTransaction();

Остальные методы служат в основном для изменения каких-либо параметров запросов и транзакций. Этот объект создается для одного Connection и он передается в Statement для выполнения запроса. QueryExecutor работает с session, который берет из состояния YdbConnectionState, также он из него берет и TxControl. Для этих целей QueryExecutor хранит и поддерживает YdbConnectionState. YdbConnectionState, кроме выдачи сессии и txControl также выдает новое состояние в зависимости от того какое состояние сейчас и какое действие произошло, методы выдачи нового состояния:

  1. YdbConnectionState withDataQuery(String txId, Session session);
  2. YdbConnectionState withBeginTransaction(String id, Session session, YdbTxSettings ydbTxSettings);
  3. YdbConnectionState withCommitTransaction();
  4. YdbConnectionState withRollbackTransaction();
  5. YdbConnectionState withAutoCommit(boolean autoCommit);
  6. YdbConnectionState withIsolationLevel(YdbIsolationLevel isolationLevel);
  7. YdbConnectionState withReadOnly(boolean readOnly);
  8. YdbConnectionState close();

Connection и имеет 3 реализации OutsideTransactionState, InsideTransactionState и CloseState.

  1. OutsideTransactionState соответствует состоянию без транзакции это auto-commit мод или не начатая или завершенная транзакция. Здесь каждый раз session создается новая. А txControl берется на основании ydbTxSettings.
  2. InsideTransactionState соответствует состоянию с открытой транзакцией. Session сохраняется и отдается на протяжении всей транзакции. txControl берется на основании id транзакции.
  3. CloseState соответствует закрытому соединению.

Состояния в QueryExecutor сменяются согласно схеме ниже: Screenshot 2024-04-09 at 17 29 33