考虑以下(伪 kotlin)代码:
@Transactional
fun updateDatabase(entity: Entity) {
// do something with entity
}
fun kafkaProduce() {
updateDatabase(entity)
kafka.sendMessage(entity.id)
}
fun kafkaConsume(entityId: Long) {
em.find(Entity::class, entityId)
}
我们的问题是我们使用READ UNCOMMITTED
通常很好的隔离级别。当调用kafkaProduce
它时,它会kafkaConsume
在事务updateDatabase
完成之前调用,并读取实体的旧状态。有没有办法做某种事情,em.waitForCompletion
以便在将消息发送到 Kafka 之前真正完成交易?
感谢 AlanHay,我找到了解决方案:
@Transactional
public void a transactionalMethod() {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
public void afterCommit(){
//do stuff right after commit
System.out.println("commit!!!");
}
});
//do db stuff
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句