Execute instructions in a transaction.
Execute instructions in a transaction. For example, to add a Person row to the database and return the contents of the Person table immediately after that:
val a = run(query[Person].insert(Person(...)): ZIO[Has[DataSource], SQLException, Long] val b = run(query[Person]): ZIO[Has[DataSource], SQLException, Person] transaction(a *> b): ZIO[Has[DataSource], SQLException, Person]
The order of operations run in the case that a new connection needs to be aquired are as follows:
getDS from env, acquire-connection, set-no-autocommit(connection), put-into-fiberref(connection), op - the corresponding execute_ method which will execute and pull connection from the fiberref, remove-from-fiberref(connection), set-prev-autocommit(connection), release-conn
Quill context that executes JDBC queries inside of ZIO. Unlike most other contexts that require passing in a Data Source, this context takes in a java.sql.Connection as a resource dependency which can be provided later (see
ZioJdbc
for helper methods that assist in doing this).The resource dependency itself is just a
Has[Connection]
. Since this is frequently used The typeQIO[T]
i.e. Quill-IO has been defined as an alias forZIO[Has[Connection], SQLException, T]
.Since in most JDBC use-cases, a connection-pool datasource i.e. Hikari is used it would actually be much more useful to interact with
ZIO[Has[DataSource], SQLException, T]
. The extension method.onDataSource
inio.getquill.context.ZioJdbc.QuillZioExt
will perform this conversion (for even more brevity useonDS
which is an alias for this method). {{ import ZioJdbc._ val zioDs = DataSourceLayer.fromPrefix("testPostgresDB") MyZioContext.run(query[Person]).onDataSource.provideCustomLayer(zioDS) }}If you are using a Plain Scala app however, you will need to manually run it e.g. using zio.Runtime {{ Runtime.default.unsafeRun(MyZioContext.run(query[Person]).provideLayer(zioDS)) }}
Note however that the one exception to these cases are the
prepare
methods where aZIO[Has[Connection], SQLException, PreparedStatement]
is being returned. In those situations the acquire-action-release pattern does not make any sense because thePrepareStatement
is only held open while it's host-connection exists.