关联 jOOQ 事务和记录监听器
Correlate jOOQ transaction & record listeners
有没有办法关联 jOOQ 事务和记录监听器?
我需要在记录添加到某个 table 后触发某些操作。 RecordListener#insertEnd
是正确的钩子,但据我所知,这并不能保证记录确实被插入了。在调用 insertEnd()
之后,事务可能仍会回滚 - 或者对一个 table 的插入可能是一批插入的一部分,这也会影响其他 table。
另一方面,如果我实施 TransactionListener#comitEnd
,我无法确定 哪个 记录实际插入的位置。 TransactionContext
没有此信息。
您可以通过访问为此目的创建的 Configuration.data()
属性 来执行此操作。考虑这两个听众:
class RL extends DefaultRecordListener {
@Override
public void insertEnd(RecordContext ctx) {
// Put some property into the data map
ctx.configuration().data("x", "y");
}
}
class TL extends DefaultTransactionListener {
String x;
@Override
public void commitEnd(TransactionContext ctx) {
// Retrieve the property again
x = (String) ctx.configuration().data("x");
}
}
然后可以按如下方式使用:
RL rl = new RL();
TL tl = new TL();
ctx.configuration()
.derive(rl)
.derive(tl)
.dsl()
.transaction(c -> {
assertNull(c.data("x"));
TRecord t = c.dsl().newRecord(T);
t.setA("a");
t.setB("b");
// insertEnd() triggered here
assertEquals(1, t.insert());
assertEquals("y", c.data("x"));
// commitEnd() triggered here
});
// Since the transaction creates a nested, derived scope, you don't see these things
// from the outside of the transaction in your possibly global Configuration
assertNull(ctx.data("x"));
assertNull(ctx.configuration().data("x"));
assertEquals("y", tl.x);
有没有办法关联 jOOQ 事务和记录监听器?
我需要在记录添加到某个 table 后触发某些操作。 RecordListener#insertEnd
是正确的钩子,但据我所知,这并不能保证记录确实被插入了。在调用 insertEnd()
之后,事务可能仍会回滚 - 或者对一个 table 的插入可能是一批插入的一部分,这也会影响其他 table。
另一方面,如果我实施 TransactionListener#comitEnd
,我无法确定 哪个 记录实际插入的位置。 TransactionContext
没有此信息。
您可以通过访问为此目的创建的 Configuration.data()
属性 来执行此操作。考虑这两个听众:
class RL extends DefaultRecordListener {
@Override
public void insertEnd(RecordContext ctx) {
// Put some property into the data map
ctx.configuration().data("x", "y");
}
}
class TL extends DefaultTransactionListener {
String x;
@Override
public void commitEnd(TransactionContext ctx) {
// Retrieve the property again
x = (String) ctx.configuration().data("x");
}
}
然后可以按如下方式使用:
RL rl = new RL();
TL tl = new TL();
ctx.configuration()
.derive(rl)
.derive(tl)
.dsl()
.transaction(c -> {
assertNull(c.data("x"));
TRecord t = c.dsl().newRecord(T);
t.setA("a");
t.setB("b");
// insertEnd() triggered here
assertEquals(1, t.insert());
assertEquals("y", c.data("x"));
// commitEnd() triggered here
});
// Since the transaction creates a nested, derived scope, you don't see these things
// from the outside of the transaction in your possibly global Configuration
assertNull(ctx.data("x"));
assertNull(ctx.configuration().data("x"));
assertEquals("y", tl.x);