MongoDBJavaでのトランザクションのコミットとロールバック

変態オサマ

現在、私は次のコードを使用しています:-

(コード内の2つの重要な行にマークを付けました。これらの行の間には、既存のドキュメントに対するいくつかの操作があります)

            clientSession.startTransaction();  // Important Line 1.
            Document walletDetailDoc = new Document("identifier", "walletBalanceDistribution");
            Document foundWalletDetailDoc1 = (Document) walletDistributionCollection.find(walletDetailDoc).first();
            walletDetailDoc = new Document("identifier", to + "Backup");
            Document foundWalletDetailDoc2 = (Document) walletDistributionCollection.find(walletDetailDoc).first();
            walletDetailDoc = new Document("identifier", from + "Backup");
            Document foundWalletDetailDoc3 = (Document) walletDistributionCollection.find(walletDetailDoc).first();
            assert foundWalletDetailDoc1 != null;
            assert foundWalletDetailDoc2 != null;
            assert foundWalletDetailDoc3 != null;


            Bson updateWalletDoc = walletDetailDoc;
            Bson updateWalletDocOperation = new Document("$set", updateWalletDoc);
            walletDistributionCollection.updateOne(foundWalletDetailDoc1, updateWalletDocOperation);
            updateWalletDoc = new Document("identifier", "walletBalanceDistribution")
                    .append("totalRTKBalanceForPool", foundWalletDetailDoc2.get("totalRTKBalanceForPool"))
                    .append("lastCheckedBlockNumber", foundWalletDetailDoc2.get("lastCheckedBlockNumber"))
                    .append("lastCheckedTransactionIndex", foundWalletDetailDoc2.get("lastCheckedTransactionIndex"))
                    .append("balanceCollectedAsFees", foundWalletDetailDoc2.get("balanceCollectedAsFees"));
            updateWalletDocOperation = new Document("$set", updateWalletDoc);
            
            //////// TEMPORARY... TO BE REMOVED
            Thread.sleep(5000);
            clientSession.abortTransaction();  // Important Line 2
            boolean abc = true;
            if(abc) {
                return;
            }
            ////////

ここで、を呼び出すabortTransaction()と、コレクションが以前の状態に戻ることを除いて、コレクションは以前の状態に戻ります//Important Line 1しかし、それは起こりませんでした。操作を続けていると、MonogDBに保存され、// Important line 2実行完了しても元に戻されません

(念のため、すべてが入っtry catchていて、どの行にもエラーはありません。コードは正常にreturnステートメントに到達します。)

また、必要に応じて、次のMaven依存関係を使用しています:-

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.2.0</version>
</dependency>

すべてが実行されるように、または何も実行されないように(つまり、ロールバック/中止)、この操作を適切に実行する方法。

変態オサマ

正解はとても簡単でした...

(@ R2D2の回答の一番下にあるリンクを参照して見つけてください。)

(TL; DR:-メソッドclientSessionの最初のパラメーターとして追加しますupdateOne)。

私たちがしなければならなかったのはこれだけです:-

        clientSession.startTransaction();  // Important Line 1.
        Document walletDetailDoc = new Document("identifier", "walletBalanceDistribution");
        Document foundWalletDetailDoc1 = (Document) walletDistributionCollection.find(walletDetailDoc).first();
        walletDetailDoc = new Document("identifier", to + "Backup");
        Document foundWalletDetailDoc2 = (Document) walletDistributionCollection.find(walletDetailDoc).first();
        walletDetailDoc = new Document("identifier", from + "Backup");
        Document foundWalletDetailDoc3 = (Document) walletDistributionCollection.find(walletDetailDoc).first();
        assert foundWalletDetailDoc1 != null;
        assert foundWalletDetailDoc2 != null;
        assert foundWalletDetailDoc3 != null;


        Bson updateWalletDoc = walletDetailDoc;
        Bson updateWalletDocOperation = new Document("$set", updateWalletDoc);
        walletDistributionCollection.updateOne(clientSession, foundWalletDetailDoc1, updateWalletDocOperation);
        updateWalletDoc = new Document("identifier", "walletBalanceDistribution")
                .append("totalRTKBalanceForPool", foundWalletDetailDoc2.get("totalRTKBalanceForPool"))
                .append("lastCheckedBlockNumber", foundWalletDetailDoc2.get("lastCheckedBlockNumber"))
                .append("lastCheckedTransactionIndex", foundWalletDetailDoc2.get("lastCheckedTransactionIndex"))
                .append("balanceCollectedAsFees", foundWalletDetailDoc2.get("balanceCollectedAsFees"));
        updateWalletDocOperation = new Document("$set", updateWalletDoc);
        
        //////// TEMPORARY... TO BE REMOVED
        Thread.sleep(5000);
        clientSession.abortTransaction();  // Important Line 2
        boolean abc = true;
        if(abc) {
            return;
        }
        ////////

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JDBCInformixトランザクションのロールバック

分類Dev

JTAトランザクションのロールバック

分類Dev

SpringのネストされたトランザクションですべてのDBコミットをロールバックする

分類Dev

トランザクションでのロールバックの管理

分類Dev

apache chemistrycmisでのトランザクションのロールバック

分類Dev

Django-トランザクションアトミックによる保存のロールバック

分類Dev

RESTとトランザクションのロールバック

分類Dev

Java EEJTAとトランザクションのロールバック

分類Dev

このコードのトランザクションとロールバック

分類Dev

静的DB接続を使用したトランザクションのコミットとロールバックc#

分類Dev

Hibernateでのロールバックトランザクション

分類Dev

Neo4j Javaでのトランザクションのクローズ/コミットの問題

分類Dev

ExecuteNonQueryAsyncとSQLトランザクションでのコミット

分類Dev

コミットまたはロールバックの代わりにMySQLInnoDBのトランザクションをキャンセルする

分類Dev

コミットされたトランザクションをロールバックする

分類Dev

ループ内のFirebird2.5コミット/ロールバック(自律型トランザクションを使用)

分類Dev

トランザクションマネージャーは最後のコミットを元に戻す/ロールバックします

分類Dev

@Test後のトランザクションのロールバック

分類Dev

HibernateのSession.close()はコミットされていないトランザクションを自動的にロールバックしますか?

分類Dev

IDOCの読み取り時にトランザクション(コミット/ロールバック)を制御する方法

分類Dev

SQL ServerトランザクションのロールバックまたはPetapocoを使用したコミット?

分類Dev

トランザクションがコミットするまでテーブルをロックする

分類Dev

EJB3トランザクションのロールバック

分類Dev

Entity Framework 6トランザクションのロールバック

分類Dev

Grails2.5.6トランザクションのロールバック

分類Dev

perform_create後のDjangoロールバックトランザクション

分類Dev

条件付きトランザクションのロールバック

分類Dev

Capybara Seleniumwebdriverトランザクションロールバックの回避策

分類Dev

EF6トランザクションのロールバック

Related 関連記事

  1. 1

    JDBCInformixトランザクションのロールバック

  2. 2

    JTAトランザクションのロールバック

  3. 3

    SpringのネストされたトランザクションですべてのDBコミットをロールバックする

  4. 4

    トランザクションでのロールバックの管理

  5. 5

    apache chemistrycmisでのトランザクションのロールバック

  6. 6

    Django-トランザクションアトミックによる保存のロールバック

  7. 7

    RESTとトランザクションのロールバック

  8. 8

    Java EEJTAとトランザクションのロールバック

  9. 9

    このコードのトランザクションとロールバック

  10. 10

    静的DB接続を使用したトランザクションのコミットとロールバックc#

  11. 11

    Hibernateでのロールバックトランザクション

  12. 12

    Neo4j Javaでのトランザクションのクローズ/コミットの問題

  13. 13

    ExecuteNonQueryAsyncとSQLトランザクションでのコミット

  14. 14

    コミットまたはロールバックの代わりにMySQLInnoDBのトランザクションをキャンセルする

  15. 15

    コミットされたトランザクションをロールバックする

  16. 16

    ループ内のFirebird2.5コミット/ロールバック(自律型トランザクションを使用)

  17. 17

    トランザクションマネージャーは最後のコミットを元に戻す/ロールバックします

  18. 18

    @Test後のトランザクションのロールバック

  19. 19

    HibernateのSession.close()はコミットされていないトランザクションを自動的にロールバックしますか?

  20. 20

    IDOCの読み取り時にトランザクション(コミット/ロールバック)を制御する方法

  21. 21

    SQL ServerトランザクションのロールバックまたはPetapocoを使用したコミット?

  22. 22

    トランザクションがコミットするまでテーブルをロックする

  23. 23

    EJB3トランザクションのロールバック

  24. 24

    Entity Framework 6トランザクションのロールバック

  25. 25

    Grails2.5.6トランザクションのロールバック

  26. 26

    perform_create後のDjangoロールバックトランザクション

  27. 27

    条件付きトランザクションのロールバック

  28. 28

    Capybara Seleniumwebdriverトランザクションロールバックの回避策

  29. 29

    EF6トランザクションのロールバック

ホットタグ

アーカイブ