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