Всякий раз, когда вы открываете транзакцию и выполняете команды для коллекции, эти команды получают блокировки в 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
Большинство этих деталей можно найти в этой документации
Если вы действительно хотите углубиться в детали реализации, чтобы ответить на этот вопрос, я предлагаю вам выкопать ответ в исходном коде для репликатора здесь