package Ġcom . code sample . ktor . db Ċ Ċ import Ġcom . github . j async . sql . db .* Ċ import Ġcom . github . j async . sql . db . pool . Connection Pool Ċ import Ġcom . github . j async . sql . db . postgresql . PostgreSQL Connection Ċ import Ġcom . github . j async . sql . db . postgresql . PostgreSQL Connection Builder . create Connection Pool Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġkotlinx . coroutines . future . future Ċ Ċ class ĠJ Async Db Api Wrapper ( db Config : ĠDB Config ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconnection Pool : ĠConnection Pool < PostgreSQL Connection > Ġ= Ġcreate Connection Pool ( ĊĠĠĠĠĠĠĠ Ġ"${ db Config . jdbc Postgres Url }? user =${ db Config . username }& password =${ db Config . password }" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġsuspend Ġfun Ġas Transaction ( is olation Level : ĠI sol ation Level , Ġtask : Ġsuspend Ġ( con : ĠS us pending Connection ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġas Transaction With Result ( is olation Level , Ġtask ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ< T > Ġas Transaction With Result ( ĊĠĠĠĠĠĠĠ Ġisolation Level : ĠI sol ation Level , ĊĠĠĠĠĠĠĠ Ġtask : Ġsuspend Ġ( con : ĠS us pending Connection ) Ġ-> ĠT ĊĠĠĠ Ġ): ĠT Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild - in Ġtransaction Ġ( no Ġisolation Ġlevel Ġset Ġavailable ) ĊĠĠĠĠĠĠĠ Ġ// Ġcan Ġhelp Ġwith Ġhttps :// github . com / j async - sql / j async - sql / pull / 2 0 9 Ġto Ġmake Ġis Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġconnection Pool . as Sus pending . in Transaction Ġ{ Ġconn Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtask . invoke ( conn ) Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġfuture Ġbased Ġapi . ĠShould Ġbe Ġable Ġto Ġset Ġisolation Ġlevel ĊĠĠĠĠĠĠĠ Ġ// ĠDoes n 't Ġwork ! ĠHow Ġto Ġawait Ġwith Ġbegin / commit / rollback ? ĊĠĠĠĠĠĠĠ Ġ// ĠShould Ġcheck Ġin Transaction Ġimplementation ĊĠĠĠĠĠĠĠ Ġ// Ġ: h mm : ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection Pool . use Ġ{ Ġconcrete Connection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pending Connection Impl Ġ= Ġconcrete Connection . as Sus pending Ġas ĠS us pending Connection Impl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= Ġconnection Pool . configuration . pool Configuration . coroutine Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Job () Ġ+ Ġdispatcher ). future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconcrete In Transaction With Isolation ( is olation Level , Ġsus pending Connection Impl , Ġtask ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T > Ġconcrete In Transaction With Isolation ( ĊĠĠĠĠĠĠĠ Ġisolation Level : ĠI sol ation Level , ĊĠĠĠĠĠĠĠ Ġsus p Connection : ĠS us pending Connection , ĊĠĠĠĠĠĠĠ Ġf : Ġsuspend Ġ( Sus pending Connection ) Ġ-> ĠT ĊĠĠĠ Ġ): ĠT Ġ= Ġcoroutine Scope Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġdoesn 't Ġwork ... Ġ: h mm : ĊĠĠĠĠĠĠĠ Ġ// ĠMaybe Ġbecause Ġit Ġsimply Ġcan Ġnot Ġwork Ġwith Ġasync Ġdriver ? ĊĠĠĠĠĠĠĠ Ġ// Ġsus p Connection . send Query (" BEGIN ĠTRAN SACTION ĠIS OL ATION ĠLE VEL Ġ${ is olation Level . as QueryString () }") ĊĠĠĠĠĠĠĠ Ġsus p Connection . send Query (" BEGIN ") ĊĠĠĠĠĠĠĠ Ġsus p Connection . send Query (" SET ĠTRAN SACTION Ġ${ is olation Level . as QueryString () }") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġf ( sus p Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsus p Connection . send Query (" COMMIT ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsus p Connection . send Query (" ROLL BACK ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊĊĊ Ċ suspend Ġfun ĠS us pending Connection . perform Query ( sql String : Ġ() Ġ-> ĠString ): ĠQuery Result Ġ{ ĊĠĠĠ Ġreturn Ġthis . send Query ( sql String . invoke ()) Ċ } ĊĊ Ċ enum Ġclass ĠI sol ation Level Ġ{ ĊĠĠĠ ĠTRAN SACTION _ READ _ UN COMMIT TED , ĊĠĠĠ ĠTRAN SACTION _ READ _ COMMIT TED , ĊĠĠĠ ĠTRAN SACTION _ REPEAT ABLE _ READ , ĊĠĠĠ ĠTRAN SACTION _ SERIAL IZ ABLE ; ĊĊĠĠĠ Ġfun Ġas QueryString () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTRAN SACTION _ READ _ UN COMMIT TED Ġ-> Ġ" TRANSACTION ĠREAD ĠUN COMMIT TED " ĊĠĠĠĠĠĠĠ ĠTRAN SACTION _ READ _ COMMIT TED Ġ-> Ġ" TRANSACTION ĠREAD ĠCOMMIT TED " ĊĠĠĠĠĠĠĠ ĠTRAN SACTION _ REPEAT ABLE _ READ Ġ-> Ġ" TRANSACTION ĠRE PEAT ABLE ĠREAD " ĊĠĠĠĠĠĠĠ ĠTRAN SACTION _ SERIAL IZ ABLE Ġ-> Ġ" TRANSACTION ĠSERIAL IZ ABLE " ĊĠĠĠ Ġ} Ċ } ĊĊĊ