transactionResult
open fun <T> transactionResult(propagation: TransactionPropagation = TransactionPropagation.REQUIRED, isolation: TransactionIsolationLevel? = null, readOnly: Boolean = false, statementTimeout: Duration? = null, transactionTimeout: Duration? = null, block: OctaviusClient.() -> DataResult<T>): DataResult<T>
transaction for the result style. A plain transaction rolls back only on a throw, so a failure turned into a value inside it is committed over; here a returned DataResult.Failure rolls back.
val created = db.transactionResult {
val id = rawQuery("INSERT INTO citizens (name) VALUES (@n) RETURNING id")
.asResult().fetchFieldStrict<Int>("n" to name)
.getOrElse { return@transactionResult it }
rawQuery("INSERT INTO citizen_profiles (citizen_id, bio) VALUES (@id, @bio)")
.asResult().executeUpdate("id" to id, "bio" to bio)
.map { id }
}Content copied to clipboard
DataResult.Success commits and is returned.
DataResult.Failure rolls back and is returned.
A throw rolls back. What dbResult would return comes back as a DataResult.Failure; the rest - an exception from your own code, a caller bug - keeps going up.
Everything else is as on transaction.