Я использую установку MongoDB 4.2 в кластере. Мой Java-код, который использует ту же структуру из примера кода со страницы документа Mongo https://docs.mongodb.com/manual/core/transactions/#transactions-and-atomicity, чтобы сначала подсчитать в коллекции, а затем выполнить удаление в другой коллекции.
В моем pom.xml: 3.11.1
Я установил Sleep, чтобы у меня было время изменить данные в первой коллекции с помощью Mongo Compass (чтобы эмулировать поток, изменяющий данные во время транзакции). К сожалению, я не вижу эффекта транзакции, удаление все еще происходит.
ClientSession clientSession = mongoClient.startSession();
TransactionOptions txnOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.MAJORITY)
.writeConcern(WriteConcern.MAJORITY)
.build();
TransactionBody<String> txnBody = new TransactionBody<String>() {
public String execute() {
final long count = siteCollection.countDocuments(clientSession, eq(Site.PARAM_CALL_LIST_ID,
callListId.getValue()));
if (count > 0) {
throw new CustomException("Cannot delete.");
}
try {
Thread.sleep(18000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final DeleteResult result = collection.deleteOne(clientSession, eq(DB_ID, callListId.getValue()));
if (result.getDeletedCount() == 0) {
throw new CustomException();
}
return "Deleted the call list";
}
};
try {
clientSession.withTransaction(txnBody, txnOptions);
} catch (RuntimeException cause) {
throw new SomeCustomerException("Failed to delete", cause);
} finally {
clientSession.close();
}
}