Version v0.26 of the documentation is no longer actively maintained. The site that you are currently viewing is an archived snapshot. For up-to-date documentation, see the latest version.
Transaction
概要
KomapperはJDBCやR2DBCのConnectionが持つトランザクション機能をラップした高レベルAPIを提供します。
Warning
Spring Frameworkなどトランザクション機能を提供するフレームワークと組み合わせてKomapperを使う場合 このページで説明するAPIを使ってはいけません。このAPIを使うには専用のモジュールをGradleの依存関係に宣言します。
JDBCを使う場合は次のようにkomapper-tx-jdbcを宣言します。
val komapperVersion: String by project
dependencies {
implementation("org.komapper:komapper-tx-jdbc:$komapperVersion")
}
R2DBCを使う場合は次のようにkomapper-tx-r2dbcを宣言します。
val komapperVersion: String by project
dependencies {
implementation("org.komapper:komapper-tx-r2dbc:$komapperVersion")
}
Note
Komapperが提供するkomapper-starter-jdbcやkomapper-starter-r2dbcモジュールは上述の設定を含んでいます。 したがって、これらのstarterモジュールを使う場合上述の設定は不要です。Note
上述のトランザクション用モジュールを依存関係に宣言する場合、全てのデータベースアクセスはトランザクション内で実行する必要があります。トランザクションの制御
Komapperが提供するトランザクション制御のためのAPIはJDBC版とR2DBC版で異なりますが見た目上のインターフェースは統一されています。 ここでは明らかに異なる部分を除いてJDBC版とR2DBC版を合わせて説明します。
JdbcDatabase
もしくはR2dbcDatabase
が下記のようにdb
という変数で宣言されていることを前提に説明を進めます。
val db = JdbcDatabase.create("jdbc:h2:mem:example;DB_CLOSE_DELAY=-1")
val db = R2dbcDatabase.create("r2dbc:h2:mem:///example;DB_CLOSE_DELAY=-1")
開始と終了
JDBC版とR2DBC版のそれぞれのモジュールに定義されたwithTransaction
拡張関数の呼び出すことでトランザクションを開始できます。
db.withTransaction {
..
}
withTransaction
拡張関数にはトランザクション属性とトランザクション分離レベルを指定できます。
db.withTransaction(
transactionAttribute = TransactionAttribute.REQUIRES_NEW,
isolationLevel = IsolationLevel.SERIALIZABLE) {
..
}
トランザクション属性を指定しない場合、トンランザクションがなければ作成しすでに存在すればそのトランザクションに参加します。
トランザクション分離レベルを指定しない場合にどのレベルになるかは利用するドライバの挙動に従います。
withTransaction
拡張関数の呼び出しが終わるとトランザクションはコミットもしくはロールバックされます。
ロールバックされる条件は次のとおりです。
withTransaction
拡張関数の呼び出しが例外のスローにより終了するwithTransaction
拡張関数に渡されたラムダ式の中で明示的にロールバックを行う
ロールバックの条件に合致しない場合コミットされます。
明示的なロールバック
withTransaction
拡張関数に渡されたラムダ式の中でsetRollbackOnly
関数を呼び出すとwithTransaction
拡張関数終了時にロールバックが実行されます。
db.withTransaction {
..
setRollbackOnly()
..
}
すでにsetRollbackOnly
関数を呼び出したかどうかはisRollbackOnly
関数で確認できます。
db.withTransaction {
..
if (isRollbackOnly()) {
..
}
..
}
新規トランザクションの開始と終了
すでに開始されたトランザクションの中で別のトランザクションを新しく開始するにはwithTransaction
拡張関数に渡されたラムダ式の中でrequiresNew
関数を呼び出します。
db.withTransaction {
..
requiresNew {
..
}
..
}
requiresNew
関数にはトランザクション分離レベルを指定できます。
db.withTransaction {
..
requiresNew(isolationLevel = IsolationLevel.SERIALIZABLE) {
..
}
..
}
トランザクション分離レベルを指定しない場合にどのレベルになるかは利用するドライバの挙動に従います。
requiresNew
関数の呼び出しが終わるとトランザクションはコミットもしくはロールバックされます。
ロールバックされる条件は次のとおりです。
requiresNew
関数の呼び出しが例外のスローにより終了するrequiresNew
関数に渡されたラムダ式の中で明示的にロールバックを行う
ロールバックの条件に合致しない場合コミットされます。