Uploaded image for project: 'Drivers'
  1. Drivers
  2. DRIVERS-488

Provide Transactions example for Docs

    • Type: Icon: Improvement Improvement
    • Resolution: Fixed
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Component/s: Docs Examples
    • Labels:
      None
    • $i18n.getText("admin.common.words.hide")
      Key Status/Resolution FixVersion
      NODE-1478 Fixed 3.1.0
      SCALA-408 Fixed 2.4.0
      PYTHON-1562 Fixed 3.7
      CSHARP-2277 Fixed 2.7.0
      PERL-908 Fixed 2.0.0
      RUBY-1340 Fixed 2.6.0
      JAVA-2866 Fixed
      CXX-1583 Fixed 3.4.0
      PHPLIB-350 Fixed 1.4.0
      MOTOR-224 Fixed 2.0
      GODRIVER-422 Fixed 1.0.0-rc1
      CDRIVER-2663 Fixed 1.11.0, 1.12.0
      SWIFT-423 Fixed 1.0.0
      RUST-813 Fixed 2.0.0-beta.1
      $i18n.getText("admin.common.words.show")
      #scriptField, #scriptField *{ border: 1px solid black; } #scriptField{ border-collapse: collapse; } #scriptField td { text-align: center; /* Center-align text in table cells */ } #scriptField td.key { text-align: left; /* Left-align text in the Key column */ } #scriptField a { text-decoration: none; /* Remove underlines from links */ border: none; /* Remove border from links */ } /* Add green background color to cells with FixVersion */ #scriptField td.hasFixVersion { background-color: #00FF00; /* Green color code */ } /* Center-align the first row headers */ #scriptField th { text-align: center; } Key Status/Resolution FixVersion NODE-1478 Fixed 3.1.0 SCALA-408 Fixed 2.4.0 PYTHON-1562 Fixed 3.7 CSHARP-2277 Fixed 2.7.0 PERL-908 Fixed 2.0.0 RUBY-1340 Fixed 2.6.0 JAVA-2866 Fixed CXX-1583 Fixed 3.4.0 PHPLIB-350 Fixed 1.4.0 MOTOR-224 Fixed 2.0 GODRIVER-422 Fixed 1.0.0-rc1 CDRIVER-2663 Fixed 1.11.0, 1.12.0 SWIFT-423 Fixed 1.0.0 RUST-813 Fixed 2.0.0-beta.1

      Hi –
      for the manual – would like to pop in driver examples in
      Drivers section and Retry section

      If we could get the corresponding driver examples.

      • The Intro example will be for the Drivers section – where it's to highlight – how to use a transaction, and the section will be emphasizing the passing of the session to the operations in the txn.
      • The retry examples will of course be in the retry section.
      
      // Start Transactions Intro Example 1
      
      function updateEmployeeInfo(session) {
          employeesCollection = session.getDatabase("hr").employees;
          eventsCollection = session.getDatabase("reporting").events;
      
          session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );
      
          try{
              employeesCollection.updateOne( { employee: 3 }, { $set: { status: "Inactive" } } );
              eventsCollection.insertOne( { employee: 3, status: { new: "Inactive", old: "Active" } } );
          } catch (error) {
              print("Caught exception during transaction, aborting.");
              session.abortTransaction();
              throw error;
          }
      
          while (true) {
              try {
                  session.commitTransaction(); // Uses write concern set at transaction start.
                  print("Transaction committed.");
                  break;
              } catch (error) {
                  // Can retry commit
                  if (error.hasOwnProperty("errorLabels") && error.errorLabels.includes("UnknownTransactionCommitResult") ) {
                      print("UnknownTransactionCommitResult, retrying commit operation ...");
                      continue;
                  } else {
                      print("Error during commit ...");
                      throw error;
                  }
             }
          }
      }
      // End Transactions Intro Example 1
      
      
      // Start Transactions Retry Example 1
      function runTransactionWithRetry(txnFunc, session) {
          while (true) {
              try {
                  txnFunc(session);  // performs transaction
                  break;
              } catch (error) {
                  print("Transaction aborted. Caught exception during transaction.");
      
                  // If transient error, retry the whole transaction
                  if ( error.hasOwnProperty("errorLabels") && error.errorLabels.includes( "TransientTransactionError")  ) {
                      print("TransientTransactionError, retrying transaction ...");
                      continue;
                  } else {
                      throw error;
                  }
              }
          }
      }
      // End Transactions Retry Example 1
      
      // Start Transactions Retry Example 2
      
      function commitWithRetry(session) {
          while (true) {
              try {
                  session.commitTransaction(); // Uses write concern set at transaction start.
                  print("Transaction committed.");
                  break;
              } catch (error) {
                  // Can retry commit
                  if (error.hasOwnProperty("errorLabels") && error.errorLabels.includes( "UnknownTransactionCommitResult") ) {
                      print("UnknownTransactionCommitResult, retrying commit operation ...");
                      continue;
                  } else {
                      print("Error during commit ...");
                      throw error;
                  }
             }
          }
      }
      // End Transactions Retry Example 2
      
      // Start Transactions Retry Example 3
      
      function runTransactionWithRetry(txnFunc, session) {
          while (true) {
              try {
                  txnFunc(session);  // performs transaction
                  break;
              } catch (error) {
                  // If transient error, retry the whole transaction
                  if ( error.hasOwnProperty("errorLabels") && error.errorLabels.includes("TransientTransactionError")  ) {
                      print("TransientTransactionError, retrying transaction ...");
                      continue;
                  } else {
                      throw error;
                  }
              }
          }
      }
      
      function commitWithRetry(session) {
          while (true) {
              try {
                  session.commitTransaction(); // Uses write concern set at transaction start.
                  print("Transaction committed.");
                  break;
              } catch (error) {
                  // Can retry commit
                  if (error.hasOwnProperty("errorLabels") && error.errorLabels.includes("UnknownTransactionCommitResult") ) {
                      print("UnknownTransactionCommitResult, retrying commit operation ...");
                      continue;
                  } else {
                      print("Error during commit ...");
                      throw error;
                  }
             }
          }
      }
      
      // Updates two collections in a transactions
      
      function updateEmployeeInfo(session) {
          employeesCollection = session.getDatabase("hr").employees;
          eventsCollection = session.getDatabase("reporting").events;
      
          session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );
      
          try{
              employeesCollection.updateOne( { employee: 3 }, { $set: { status: "Inactive" } } );
              eventsCollection.insertOne( { employee: 3, status: { new: "Inactive", old: "Active" } } );
          } catch (error) {
              print("Caught exception during transaction, aborting.");
              session.abortTransaction();
              throw error;
          }
      
          commitWithRetry(session);
      }
      
      // Start a session.
      session = db.getMongo("myRepl/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017").startSession( { mode: "primary" } );
      
      try{
         runTransactionWithRetry(updateEmployeeInfo, session);
      } catch (error) {
         // Do something with error
      } finally {
         session.endSession();
      }
      
      // End Transactions Retry Example 3
      
      

      cc: rathi.gnanasekaran scott.lhommedieu behackett

            Assignee:
            Unassigned Unassigned
            Reporter:
            kay.kim@mongodb.com Kay Kim (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: