Details
-
Improvement
-
Resolution: Fixed
-
Major - P3
-
None
-
None
Description
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
|
|
Attachments
Issue Links
- depends on
-
CXX-1583 Provide Transactions example for Docs
-
- Closed
-
-
GODRIVER-422 Provide Transactions example for Docs
-
- Closed
-
-
PHPLIB-350 Provide Transactions example for Docs
-
- Closed
-
-
RUST-813 Provide transactions examples for docs
-
- Closed
-
-
CDRIVER-2663 Provide Transactions example for Docs
-
- Closed
-
-
CSHARP-2277 Provide Transactions example for Docs
-
- Closed
-
-
JAVA-2866 Provide Transactions example for Docs
-
- Closed
-
-
MOTOR-224 Provide Transactions example for Docs
-
- Closed
-
-
NODE-1478 Provide Transactions example for Docs
-
- Closed
-
-
PYTHON-1562 Provide Transactions example for Docs
-
- Closed
-
-
RUBY-1340 Provide Transactions example for Docs
-
- Closed
-
- has to be done before
-
DRIVERS-577 Update Transactions Retry Example 3 to include read preference
-
- Closed
-
- is related to
-
MOTOR-427 Provide transaction retry examples for Docs
-
- Closed
-
- related to
-
DOCS-11975 Transaction example for C# does not use transaction
-
- Closed
-