-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
make Session.shutdown()/close, Transaction.close(), and PreparedState…
…ment close() execute asynchronously
- Loading branch information
1 parent
712a02a
commit 4abe9a9
Showing
11 changed files
with
699 additions
and
232 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# Transaction closeに関する状態遷移 | ||
2024.12.04 | ||
NT horikawa | ||
|
||
## 定義 | ||
### 状態 | ||
* initial | ||
* committed | ||
* rollbacked | ||
* toBeClosed | ||
* toBeClosedWithCommit | ||
* toBeClosedWithRollback | ||
* closed | ||
|
||
### 変数 | ||
* FutureResponse<Void> commitResult | ||
`synchronized (this)` により排他アクセスを保証 | ||
|
||
### 状態と変数等 | ||
| 状態 | commitResult | commit要求 | rollback要求 | delayedClose登録 | Transaction close<br>completed | | ||
| ---- | ---- | ---- | ---- | ---- | ---- | | ||
| initial | null | false | false | false | false | | ||
| committed | not null | true| false | false | false | | ||
| rollbacked | null | false | true | false | false | | ||
| toBeClosed | null | false | false | true | false | | ||
| toBeClosedWithCommit | not null | true | false | true | false | | ||
| toBeClosedWithRollback | null | false | true | true | false | | ||
| closed | - | - | - | - | false | | ||
|
||
`-`はdon't careを示す。 | ||
|
||
## 状態遷移 | ||
| 状態 | event<br>(API call) | 遷移先 | 備考 | | ||
| ---- | ---- | ---- | ---- | | ||
| initial | commit() | committed | commitを要求する | ||
| initial | rollback() | rollbacked | rollbackを要求する | ||
| initial | close() | toBeClosed | DelayedCloseをDisposerに登録する | ||
| committed | commit() | - | ccommitを要求している旨の例外を投げる | ||
| committed | rollback() | - | commitを要求している旨の例外を投げる | ||
| committed | close() | closed | commitのレスポンスが返ってきている場合、<br>doClose()を実行する | ||
| committed | close() | toBeClosedWithCommit | commitのレスポンスが返ってきていない場合、<br>DelayedCloseをDisposerに登録する | ||
| rollbacked | commit() | - | rollbackを要求している旨の例外を投げる | ||
| rollbacked | rollback() | - | 正常終了を返す | ||
| rollbacked | close() | toBeClosedWithRollback | DelayedCloseをDisposerに登録する | ||
| toBeClosed | commit() | - | closeされている旨の例外を投げる | ||
| toBeClosed | rollback() | - | closeされている旨の例外を投げる | ||
| toBeClosed | close() | - | do nothing | ||
| toBeClosed | doClose() | closed | rollbackとdisposeを要求する | ||
| toBeClosedWithCommit | commit() | - | closeされている旨の例外を投げる | ||
| toBeClosedWithCommit | rollback() | - | closeされている旨の例外を投げる | ||
| toBeClosedWithCommit | close() | - | do nothing | ||
| toBeClosedWithCommit | doClose() | closed | commitResultをget()し、不成功ならdisposeを要求する | ||
| toBeClosedWithRollback | commit() | - | closeされている旨の例外を投げる | ||
| toBeClosedWithRollback | rollback() | - | closeされている旨の例外を投げる | ||
| toBeClosedWithRollback | close() | - | do nothing | ||
| toBeClosedWithRollback | doClose() | closed | disposeを要求する | ||
| closed | commit() | - | closeされている旨の例外を投げる | ||
| closed | rollback() | - | closeされている旨の例外を投げる | ||
| closed | close() | - | do nothing | ||
|
||
`-`は「状態遷移しない」を示す。 | ||
doClose()はDisposerに登録したDelayedCloseのみからcallされる。他はpublicメソッド。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# Transactionのauto_disposeについて | ||
2024.11.28 | ||
NT horikawa | ||
|
||
## 前提 | ||
* SQL実行エンジンに対するTransactionからのcommit要求が、SQL実行エンジンにおいてエラーなく終了しなかった場合、そのTransactionはgetSqlServiceException()によりエラー情報を取得できる。 | ||
* これに備え、SQL実行エンジンはTransactionからのcommit要求の処理がエラーなく終了しなかった場合、そのTransactionに対応するトランザクションリソースを解放せずに残しておく。 | ||
* 上記SQL実行エンジンが確保しているトランザクションリソースはTransactionからのdispose要求により解放される。 | ||
* Transactionからのrollback要求は、commit失敗時と同等の扱いとなる。 | ||
|
||
### 実装における要注意点 | ||
* DisposeTransactionメッセージ内のtransaction_handle(https://github.com/project-tsurugi/tsubakuro/blob/712a02a98329338b744d8a63289793374c461d46/modules/proto/src/main/protos/jogasaki/proto/sql/request.proto#L435 )はSQL実行エンジンにおいて一意ではなく、あるTransactionに対応するトランザクションリソースが解放されると、そのTransactionのものと同じ値のtransaction_handleが再利用される可能性がある。 | ||
* 上記のため、あるTransactionからのauto_dispose(https://github.com/project-tsurugi/tsubakuro/blob/712a02a98329338b744d8a63289793374c461d46/modules/proto/src/main/protos/jogasaki/proto/sql/request.proto#L384 )をtrueとしたcommit要求が成功し、SQL実行エンジンがTransactionに対応するトランザクションリソースを解放した後は、そのTransactionのものと同じ値のtransaction_handleが再利用される可能がある。 | ||
|
||
### Transactionに必要な制約 | ||
「実装における要注意点」に示したSQLエンジン挙動のため、Transactionは下記制約を充足する必要がある。 | ||
* あるTransactionからのauto_disposeをtrueとしたcommit要求をSQL実行エンジンが受け付け、それが成功した場合、以降、そのTransactionからSQL実行エンジンに対してgetSqlServiceException()やdispose要求を行ってはならない。 | ||
* なぜなら、SQL実行エンジンがtransaction_handleを再利用した場合、最初のTransactionが保有するtransaction_handleは既に別のTransactionと対応しているため、最初のTransactionからgetSqlServiceException()やdispose要求を行ってはならない、特にdispose要求の場合はSQL実行エンジンの誤動作を引き起こすことになるからである。 | ||
|
||
## TsubakuroのTrancacionImplクラスにおける制約の充足方法 | ||
「Transactionに必要な制約」を充足するため、TransactionImplは下記の制御を行う。 | ||
* auto_disposeをtrueとしたTransaction.commit()が実行された際は、戻り値であるFutureResponse<Void>をTransaction内に格納する。 | ||
* TransactionのgetSqlServiceException()やclose()が実行された際、前記FutureResponse<Void>が格納されていると、それをget()してcommitが成功したか否かを調べ、commitが失敗していた場合にのみSQL実行エンジンにgetSqlServiceExceptionやdispose要求を送る。これにより、auto_disposeをtrueとしたcommitが成功した場合、そのTransactionからgetSqlServiceExceptionやdispose要求をSQL実行エンジンに送らないように制御する。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.