Как заставить создание новой транзакции в Lift Mapper?
Мы используем Lift + Mapper (версия 2.4) в нашем проекте. Мы также используем шаблон транзакции на запрос S.addAround(DB.buildLoanWrapper())
,
В одном из наших запросов нам нужна вложенная транзакция, которая показалась нам проблематичной. Мы обнаружили, что одним из возможных "хаков" является запуск транзакции в отдельном потоке (как в примере ниже), потому что DB
объект использует ThreadLocal
управлять информацией о текущем соединении и состоянии транзакции.
Есть ли реализация, которая лучше (более безопасная и без многопоточности), чем приведенная ниже?
import net.liftweb.db.{DefaultConnectionIdentifier, DB}
import akka.dispatch.Future
/**
* Will create a new transaction if none is in progress and commit it upon completion or rollback on exceptions.
* If a transaction already exists, it has no effect, the block will execute in the context
* of the existing transaction. The commit/rollback is handled in this case by the parent transaction block.
*/
def inTransaction[T](f: ⇒ T): T = DB.use(DefaultConnectionIdentifier)(conn ⇒ f)
/**
* Causes a new transaction to begin and commit after the block’s execution,
* or rollback if an exception occurs. Invoking a transaction always cause a new one to be created,
* even if called in the context of an existing transaction.
*/
def transaction[T](f: ⇒ T): T = Future(DB.use(DefaultConnectionIdentifier)(conn ⇒ f)).get
1 ответ
К сожалению, похоже, не существует существующего API. Вы можете спросить о добавлении одного в группу Google. Однако ничто не мешает вам делать что-то вроде:
DB.use(DefaultConnectionIdentidier){ sc =>
val conn: java.sql.Connection = sc.connection
// use regular JDBC mechanism here
}