我们如何确定我们已经在交易块中?

How can we determine, that we are already in transaction block?

我在没有 DAO 的情况下使用带有咖啡因缓存的 exposed。 常见用法是

transaction {
  val row = rowService.getById(1)!! 
} 

RowService 首先尝试在缓存中查找行,如果没有,运行 将再次查询数据库。我怀疑即使没有任何查询,事务块也会有一些开销,如果我大部分时间缓存命中,我想在 RowService 中移动事务块,它从数据库中解析数据,但是我不想在中创建嵌套事务过程。

我如何检查我是否已经在事务块中并重新使用它或打开一个新块和运行我的获取语句和?

Since Exposed 0.16.1 it is possible to use nested transactions. To enable this feature you should set useNestedTransactions on desire Database instance to true.

只是不要设置 useNestedTransactions(或者更好,将其明确设置为 false),您将获得所需的行为。

默认情况下,嵌套的 transaction 块将重用最外层的 Transaction 实例。 但是如果你想确保从代码开始 Transaction 你可以检查它:TransactionManager.currentOrNull() != null