Как заставить создание новой транзакции в 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
}
Другие вопросы по тегам