Image
Top
Navigation

トランザクションを利用する その2

前回、リモート接続ではバイナリ接続以外はランザクションが利用できないと書きました。
バイナリ接続ではない方法としては、ドキュメントデータベースの場合は、ODatabaseDocumentTxを利用している場合は
command()やquery()メソッドを利用した場合が当てはまります。

挙動を確認するために一つのトランザクションの中で二種類のプロトコルを利用した場合のサンプルです。

最初にODocument のインスタンスに対してsave()を実行し、次にOCommandSQLを使用してInsert 文を実行しています。
そして最後にロールバックを実行しています。

package transaction;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;

public class Transaction {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {

            // リモートでデータベースへ接続します。
            ODatabaseDocumentTx db = new ODatabaseDocumentTx("remote:172.16.251.205/DocumentTest");
            db.open("root", "root");

            String className = "SampleClass";

            db.getMetadata().getSchema().getOrCreateClass(className);
            db.begin();

            //NativeAPIから直接登録
            ODocument doc = new ODocument(className);
            doc.field("name", "tran-sample1");
            doc.field("id", 99999991);
            doc.save();

            //Insert 文
            String insertQuery = "insert into SampleClass (name,id) values (?,?)";

            Object[] ages1 = { "tran-sample2", 99999992 };

            db.command(new OCommandSQL(insertQuery)).execute(ages1);

            //あえてここでロールバック
            db.rollback();

            for (ODocument result : db.browseClass(className)) {
                System.out.println("Rec ID : " + result.getIdentity());
                System.out.println("Name   : " + result.field("name"));
                System.out.println("id: " + result.field("id"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

実行結果

Rec ID : #24:2
Name : tran-sample2

結果としては、transactionに対応してないOCommandSQLのみがInsertされてしまいます。

さてそれでは、plocalでデータベースへ接続した場合も確認します。


        // remoteでデータベースへ接続します。
//      ODatabaseDocumentTx db = new ODatabaseDocumentTx("remote:172.16.251.205/DocumentTest");
//      db.open("root", "root");

        // plocalでデータベースへ接続します。
        // plocaで接続します。
        ODatabaseDocumentTx db = new  ODatabaseDocumentTx("plocal:/opt/OrientDB/databases/DocumentTest3");
        db.open("admin", "admin");

変更箇所は接続部のみで実行するとsaveもInsertもロールバックされます。
commitすると問題なく登録されます。

----+----+------------+--------
# |@RID|name |id
----+----+------------+--------
0 |#9:0|tran-sample1|99999991
1 |#9:1|tran-sample2|99999992
----+----+------------+--------

上記のremoteとplocalの際の挙動の違いはGraphデータベースを利用している時でも一緒です。
Graphデータベース版も載せて欲しいという場合はご連絡ください。