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