下面列出了怎么用com.mongodb.TransactionOptions的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public boolean open() {
if (isOpen()) {
return true;
}
LOG.info("Initializing MongoDB at {}", mongoClientUri);
// Get the client and create a session for this instance
MongoClient mongoClient =
MongoConnectionManager.inst().getMongoClientInstance(this.mongoClientUri);
ClientSessionOptions sessionOptions =
ClientSessionOptions.builder()
.causallyConsistent(true)
.defaultTransactionOptions(
TransactionOptions.builder()
.readConcern(ReadConcern.DEFAULT)
.writeConcern(WriteConcern.MAJORITY)
.readPreference(ReadPreference.nearest())
.build())
.build();
this.clientSession = mongoClient.startSession(sessionOptions);
// Get the database and our collection. Mongo takes care of creating these if they don't
// exist
MongoDatabase mongoDb = mongoClient.getDatabase(MongoConstants.AION_DB_NAME);
// Gets the collection where we will be saving our values. Mongo creates it if it doesn't
// yet exist
this.collection = mongoDb.getCollection(this.name, BsonDocument.class);
LOG.info("Finished opening the Mongo connection");
return isOpen();
}
/**
* Taken from <a href="https://docs.mongodb.com/manual/core/transactions/">https://docs.mongodb.com</a>
*/
@Test
public void shouldExecuteTransactions() {
try (
// creatingMongoDBContainer {
final MongoDBContainer mongoDBContainer = new MongoDBContainer()
// }
) {
// startingMongoDBContainer {
mongoDBContainer.start();
// }
final String mongoRsUrl = mongoDBContainer.getReplicaSetUrl();
assertNotNull(mongoRsUrl);
final MongoClient mongoSyncClient = MongoClients.create(mongoRsUrl);
mongoSyncClient.getDatabase("mydb1").getCollection("foo")
.withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("abc", 0));
mongoSyncClient.getDatabase("mydb2").getCollection("bar")
.withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("xyz", 0));
final ClientSession clientSession = mongoSyncClient.startSession();
final TransactionOptions txnOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.LOCAL)
.writeConcern(WriteConcern.MAJORITY)
.build();
final String trxResult = "Inserted into collections in different databases";
TransactionBody<String> txnBody = () -> {
final MongoCollection<Document> coll1 =
mongoSyncClient.getDatabase("mydb1").getCollection("foo");
final MongoCollection<Document> coll2 =
mongoSyncClient.getDatabase("mydb2").getCollection("bar");
coll1.insertOne(clientSession, new Document("abc", 1));
coll2.insertOne(clientSession, new Document("xyz", 999));
return trxResult;
};
try {
final String trxResultActual = clientSession.withTransaction(txnBody, txnOptions);
assertEquals(trxResult, trxResultActual);
} catch (RuntimeException re) {
throw new IllegalStateException(re.getMessage(), re);
} finally {
clientSession.close();
mongoSyncClient.close();
}
}
}
@Override
public TransactionOptions getTransactionOptions() {
return wrapped.getTransactionOptions();
}
@Override
public void startTransaction(final TransactionOptions transactionOptions) {
wrapped.startTransaction(transactionOptions);
}
@Override
public TransactionOptions getTransactionOptions() {
return session.getTransactionOptions();
}
@Override
public void startTransaction(final TransactionOptions transactionOptions) {
session.startTransaction(transactionOptions);
}
@Override
public <T> T withTransaction(final TransactionBody<T> transactionBody, final TransactionOptions options) {
return session.withTransaction(transactionBody, options);
}
/**
* Gets the transaction options. Only call this method of the session has an active transaction
*
* @return the transaction options
*/
TransactionOptions getTransactionOptions();
/**
* Start a transaction in the context of this session with the given transaction options. A transaction can not be started if there is
* already an active transaction on this session.
*
* @param transactionOptions the options to apply to the transaction
*
* @mongodb.server.release 4.0
*/
void startTransaction(TransactionOptions transactionOptions);