我们在项目中使用Lift + Mapper(版本2.4)。我们也在使用每个请求的事务模式S.addAround(DB.buildLoanWrapper())
。
在我们的一个请求中,我们需要嵌套事务,我们发现这些事务有问题。我们发现可能的“hacks”之一是在单独的线程中启动事务(如下面的示例所示),因为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
答案 0 :(得分:0)
不幸的是,似乎没有现有的API。您可以询问在Google群组中添加一个。然而,没有什么可以阻止你做类似的事情:
DB.use(DefaultConnectionIdentidier){ sc =>
val conn: java.sql.Connection = sc.connection
// use regular JDBC mechanism here
}