在什么时候我可以相信数据已保存到mysql?

时间:2016-01-15 21:23:50

标签: java jpa spring-boot rabbitmq transactional

在我创建一个新对象'Order'之后,我想获取它生成的ID并将其放在AMQP队列中,以便工作人员可以使用它做其他事情。工作人员获取生成的ID(消息)并查找订单但是抱怨没有记录存在,即使我刚创建了一个。我想知道在我将消息(生成的ID)放在队列之前调用我的.persist()之后要等多长时间(我认为这不是一个好主意);让工作循环一遍又一遍,直到mysql返回一条记录(我也不喜欢);或者在我知道数据在mysql中是安全的之后找到我可以将消息放入队列的点(这听起来最好)。我认为它需要在任何@Transactional方法之外完成。

要从mysql读回数据的worker是另一台服务器上不同系统的一部分。那么我什么时候可以告诉工作人员数据是在mysql中,以便它可以开始执行它的任务?

在@Transactional方法完成数据完成后写入mysql是否属实,我无法理解这一点。 万分感谢先进。

1 个答案:

答案 0 :(得分:0)

  

@Transactional方法完成数据后是否正确?   完成写入mysql,我无法理解这一点。   万分感谢先进。

首先,正如Kayamann和Ralf在评论中所写,当事务提交(结束)时,保证数据存储并可用于其他进程

@Transactional方法很容易理解。当您使用@Transactional方法时,这意味着容器(将要实际调用该方法的应用程序)将在调用方法之前开始事务,并在成功或错误时自动提交或回滚事务。

所以,如果我们有

@Transactional
public void modify(){
   doSomething();
}

当你在代码中的某个地方打电话(或者因为某些绑定而通过容器调用)时,实际的咒语将如下所示

tx=entityManager.beginTransaction();
object.modify();
tx.commit();

很简单。这种方法意味着交易是Container Controlled

作为四种情况,为了让您的外部系统知道事务已经完成,您必须使用消息队列(您已使用的消息队列)以及一些id已完成事务的消息,并且它可以开始处理东西,或使用不同的技术,例如REST。

远程系统可以通过队列和REST服务向各个事件发出各种事件的信号,因此没有区别。