Transactions
Execute multiple queries and actions in a transaction
ExoQuery supports transactions! Once a query or action is built e.g. once you do .buildFor.Postgres() you will get one of three possbile things:
- A
SqlCompiledQueryobject. This is a query that can be executed on the database. - A
SqlCompiledActionobject. This is an action that can be executed on the database. - A
SqlCompiledBatchActionobject This is a SQL batch action, typically it is not supported for transactions.
Once you have imported a ExoQuery runner project (e.g. exoquery-runner-jdbc) and created a DatabaseController (e.g. JdbcControllers.Postgres), you can run the query or action:
val ds: DataSource = ...
val controller = JdbcControllers.Postgres(ds)
val getJoes = sql {
Table<Person>().filter { p -> p.name == "Joe" }
}.buildFor.Postgres()
fun setJoesToJims(ids: List<String>) = sql {
update<Person> { set(name to "Jim").where { p -> p.id in params(ids) } }
}.buildFor.Postgres()
controller.transaction {
val allJoes = getJoes.runOn(controller)
// Execute some runtime logic to filter the people we want to update i.e. `shouldActuallyBeUpdated`
val someJoes = allJoes.filter { p -> shouldActuallyBeUpdated(p) }
setJoesToJims(someJoes).runOn(controller)
}