【发布时间】:2016-09-04 06:35:20
【问题描述】:
我有使用事务在 Kotlin 中编写的 Jooq 代码,有时我希望一个方法作为一个顶级操作独立工作,该操作将拥有自己的事务,而其他时候希望它与相同的交易。例如,我有两个较低级别的函数actionAbc 和actionXyz,我想将它们组合成不同的较高级别的数据方法并继承它们的事务(如果存在),否则有它们自己的。
我知道在 Spring 或其他框架中可以添加注释来验证“需要事务”或“如果没有则创建事务”类型的功能。但是如何在不使用这些库的情况下对 Jooq + Kotlin 做同样的事情呢?
我想出的最接近的方法是将事务作为可选参数传入,如果丢失,则将其默认为新事务。但是如果有人忘记传递事务,然后使用新的顶级且不相关的事务出现微妙的失败,我不希望那样。
fun tx(ctx: DSLContext = rootContext, codeBlock: DSLContext.() -> Unit): Unit {
ctx.transaction { cfg ->
DSL.using(cfg).codeBlock()
}
}
}
// and used as:
fun actionAbc(parm1: String, parm2: Int, ctx: DSLContext = rootContext) {
tx(ctx) { ... }
}
fun actionXyz(parm: Date, ctx: DSLContext = rootContext) {
tx(ctx) { ... }
}
// composed:
fun higherLevelAction(parm1: String, parm2: Date) {
tx {
actionAbc(parm1, 45, this) // if you forget `this` you are doing the wrong thing
actionXyz(parm2, this)
tx(this) {
// nested transaction, also dangerous if forgetting `this` parameter
}
}
}
我怎样才能更自然、更不危险地做到这一点?
注意: 此问题是作者 (Self-Answered Questions) 有意编写和回答的,因此常见的 Kotlin 主题的答案出现在 SO 中。
【问题讨论】:
标签: transactions kotlin jooq