in exposed-jdbc/src/main/kotlin/org/jetbrains/exposed/v1/jdbc/transactions/Transactions.kt [255:290]
suspend fun <T> suspendTransaction(
db: Database? = null,
transactionIsolation: Int? = db?.transactionManager?.defaultIsolationLevel,
readOnly: Boolean? = db?.transactionManager?.defaultReadOnly,
statement: suspend JdbcTransaction.() -> T
): T {
val databaseToUse = resolveDatabaseOrThrow(db)
val outer = databaseToUse.transactionManager.getCurrentContextTransaction()
return if (outer != null) {
val transaction = outer.transactionManager.newTransaction(
transactionIsolation ?: outer.transactionManager.defaultIsolationLevel,
readOnly ?: outer.transactionManager.defaultReadOnly,
outer
)
@OptIn(InternalApi::class)
withTransactionContext(transaction) {
executeTransactionWithErrorHandling(
transaction,
shouldCommit = outer.db.useNestedTransactions
) {
transaction.statement()
}
}
} else {
inTopLevelSuspendTransaction(
db,
transactionIsolation,
readOnly,
null,
statement
)
}
}