Транзакция MongoDD 4.2 в разных коллекциях - PullRequest
0 голосов
/ 18 октября 2019

Я использую установку 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();
  }
  }
...