我有一种方法可以将数据从一个数据库传输到另一个数据库,并在此过程中在目标数据库中创建新表。该方法是无状态 EJB(Java EE 6,GF 3.1)的一部分,因此默认情况下,容器会在调用该方法时启动分布式事务。
数据传输过程本质上分为两个独立的步骤 1. 从源数据库读取 2. 写入目标数据库。如果读取步骤失败,那么我不希望写入步骤发生,但如果写入步骤失败并且读取已经提交,我真的不在乎 - 我只是把数据扔掉。
最初我遇到了我的数据源不是 XADataSource 的问题,所以容器抱怨了这一点。然后我将它们转换为 XADataSource,但它仍然失败,因为写入过程(在 MySQL 数据库中)包含导致隐式提交的创建表语句,而您不能在分布式事务中执行此操作。
我最终得出的解决方案是将传输方法标记为TransactionAttributeType.NOT_SUPPORTED,然后将读写过程放入父传输方法调用的自己的方法中。
不过我的问题是:读写方法是在它们自己的事务中运行还是 NOT_SUPPORTED 传播给它们?我的猜测是他们有一个隐式的 TransactionAttributeType.REQUIRED ,因此会开始他们自己的事务,但我不确定,我认为它们在事务中运行很重要。
这是解决这个问题的最佳方法吗?