2016-11-23 8 views
0

TL; DR JavaサーバーからリモートOrientDBデータベースを使用する場合、SQLコマンドをトランザクションで実行させるにはどうすればよいですか?リモートOrientDBでトランザクションを使用する方法

ロングバージョン

私は、Javaのサーバーから接続リモートOrientDBデータベースを持っています。

私はdb.begin()と呼びますが、データベースの更新後にdb.commit()またはdb.rollback()と呼びます。

だから、これは私がやろうとしていたもの、最初は次のとおりです。

try { 
    db.begin(); 
    db.command(new OCommandSQL('delete edge connected from #10:1')).execute(); 
    db.command(new OCommandSQL('create edge connected from #10:1 to BROKEN_SQL')).execute(); 
    db.commit(); 
} catch (Throwable e) { 
    db.rollback(); 
} 

動作しなかったこと。それは、(コミットされる前に)エッジを削除しました。期待どおりに稜線を作成する際に例外をスローしたが、ロールバックしなかった。私は、ドキュメントに読み込むこと

NOTE: OrientDB keeps the transaction on client RAM 

クライアントのRAM。つまり、データベースサーバは、db.commit()が呼び出されるまで、Javaサーバが何をしているのか全く知らないということです。

これは私には起こりません。コードをステップ実行すると、各コマンドは実際にサーバー上で実行され、db.begin()db.rollback()は何の効果もありません。それから私は読む

SQL commands are always executed on the server side. 
They don't care if you're in the middle of a transaction on the client side! 

OK!それはそれを説明する。私はしかし、db.save(o)db.delete(o)とトランザクションを使用して成功を持っているん

Request processing failed; nested exception is com.orientechnologies.orient.core.command.OCommandExecutorNotFoundException: 
Cannot find a command executor for the command request: sql.begin 

:だから私はすぐに失敗し、この

try { 
    db.command(new OCommandSQL('begin')).execute(); 
    db.command(new OCommandSQL('delete edge connected from #10:1')).execute(); 
    db.command(new OCommandSQL('create edge connected from #10:1 to BROKEN_SQL')).execute(); 
    db.command(new OCommandSQL('commit')).execute(); 
} catch (Throwable e) { 
    db.command(new OCommandSQL('rollback')).execute(); 
} 

を試してみてください。すべてがドキュメントと一致するように見えます。しかし、私はどのように私のSQLコマンドがトランザクションで行われていることを確認する必要があります。トランザクションがクライアントかサーバーにあるかどうかは気にしません。私はOrientDB 2.1.13,2.1.15と2.1.25で試しました。

+0

最後のバージョン(2.2.13)で試しましたか? –

+0

@AlessandroRota私はしていません。私がドキュメンテーションで見ることができるように、彼らは彼らのデザインを変更したと信じる理由はありません。それがどのように動作するかはバグではなく、むしろ(それは奇妙な)彼らがそれを望む方法です。それともそれが違うと信じる理由があると言っているのですか? – Hampus

答えて

0

解決策が見つかりました。いくつかのヘルプクラスでは、それを拡大縮小することが可能かもしれません。

StringBuilder query = new StringBuilder(); 
query.append("begin\n"); 
things.forEach((thing) -> { 
    query.append("delete edge owner from " + thing.getId() + "\n"); 
    query.append("create edge owner from " + thing.getId() + " to " + newOwner.getId() + "\n"); 
}); 
query.append("commit\n"); 

try { 
    db.command(new OCommandScript(query)).execute() 
} catch (Throwable t) { 
    logger.error(t.toString()); 
} 
関連する問題