Недостатки CommitAsync () без каких-либо изменений в коллекции - PullRequest
0 голосов
/ 12 мая 2018

Все образцы обычно демонстрируют какое-то изменение надежных коллекций с CommitAsync() или откат в случае сбоя. Мой код использует TryRemoveAsync(), поэтому сбой не является проблемой (будет повторен позже).

Есть ли существенный недостаток при вызове tx.CommitAsync(), когда нет изменений в надежных коллекциях, где они были выполнены?

1 Ответ

0 голосов
/ 12 мая 2018

Всякий раз, когда вы открываете транзакцию и выполняете команды для коллекции, эти команды получают блокировки в TStore (коллекция) и записываются во временный словарь транзакций (отслеживание изменений), а также в журналы транзакций, затем репликатор пересылает эти изменения в репликах.

После выполнения tx.CommitAsync() временные записи сохраняются на диск, транзакция регистрируется в журналах, а затем реплицируется на вторичные реплики для фиксации и сохранения на диск, а затем снимаются блокировки.

Если коллекция не изменена, транзакция не будет ничего сохранять / копировать и просто закроет транзакцию.

Если вы не вызываете tx.CommitAsync() после операции, транзакция прерывается, а все ожидающие операции (если таковые имеются) отбрасываются, а операция прерывания записывается в журналы для уведомления других реплик.

В обоих случаях, Commit и Abort, будут генерировать журналы (и копировать их). Единственная деталь, в которой я не уверен, это то, что эти журналы также генерируются, когда нет изменений, я предполагаю, что они есть. Что касается производительности, то при чтении или попытке изменить коллекцию будут возникать блокировки, и их нужно будет разблокировать с фиксацией или прерыванием, я думаю, что они окажут наибольшее влияние на ваш код, потому что они будут препятствовать другим потокам изменять его, пока вы не завершить транзакцию. В этом случае я бы не слишком волновался, совершая пустую транзакцию.

   // Create a new Transaction object for this partition
   using (ITransaction tx = base.StateManager.CreateTransaction()) {
      //modify the collection
      await m_dic.AddAsync(tx, key, value, cancellationToken);

      // CommitAsync sends Commit record to log & secondary replicas
      // After quorum responds, all locks released
      await tx.CommitAsync();
   } // If CommitAsync not called, this line will Dispose the transaction and discard the changes

Большинство этих деталей можно найти в этой документации

Если вы действительно хотите углубиться в детали реализации, чтобы ответить на этот вопрос, я предлагаю вам выкопать ответ в исходном коде для репликатора здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...