Cassandra データベースに Kundera (V3.2) のトランザクション管理を使用したいと考えています。https://github.com/impetus-opensource/Kundera/wiki/Transaction-Managementを参照すると、この機能を使用できるはずです。私は次のコードを書きました:
public void update(Account entity){
EntityManager manager = this.entityManagerFactory.createEntityManager(getProperties());
manager.setFlushMode(FlushModeType.COMMIT);
manager.getTransaction().begin();
try{
String queryStringNative = "UPDATE account SET value = 20 WHERE id = 'xxx' IF value = 10";
Query query = manager.createNativeQuery(queryStringNative);
query.executeUpdate();
String queryStringNative1 = "UPDATE account SET value = 30 WHERE id = 'yyy' IF value = 40";
Query query1 = manager.createNativeQuery(queryStringNative1);
query1.executeUpdate();
//commit
manager.getTransaction().commit();
} catch(Exception e){
manager.getTransaction().rollback();
}
manager.clear();
manager.close();
}
しかし、2 番目のクエリでエラーをシミュレートすると、ロールバックが機能せず、ID 'xxx' のアカウントが更新されます。
私の質問は、私の特定の方法で kundera-cassandra に Kundera のトランザクション実装を使用することは一般的に可能ですか?
編集:
Kundera は EventLogQueue を使用してロールバックまたはコミットを実行することがわかりました。キューにあるイベントを読み取り、これらのイベントをロールバックします。問題は、EventQueue が EntityManager.persist()、EntityManager.remove()、または EntityManager.merge() のメソッド呼び出しによって送信されたイベントのみを受信するという継ぎ目です。そのため、ネイティブ クエリの実行時にエントリはありません。