Azure service fabric CommitAsync()的缺点,不需要对集合进行任何更改

Azure service fabric CommitAsync()的缺点,不需要对集合进行任何更改,azure-service-fabric,Azure Service Fabric,所有示例通常使用CommitAsync()演示对可靠集合的某种更改,或者在出现故障时回滚。我的代码正在使用TryRemoveAsync(),因此故障不成问题(稍后将重试) 当可靠的集合未发生更改时,调用tx.CommitAsync()是否有明显的缺点?每当打开事务并对集合执行命令时,这些命令都会在TStore(集合)中获取锁,并记录到事务临时字典(更改跟踪)中然后,复制器将这些更改转发到事务日志 执行tx.CommitAsync()后,临时记录将保存到磁盘,事务将在日志中注册,然后复制到辅助副本

所有示例通常使用
CommitAsync()
演示对可靠集合的某种更改,或者在出现故障时回滚。我的代码正在使用
TryRemoveAsync()
,因此故障不成问题(稍后将重试)


当可靠的集合未发生更改时,调用
tx.CommitAsync()
是否有明显的缺点?

每当打开事务并对集合执行命令时,这些命令都会在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
你可以在这个网站上找到这些细节


如果您真的想深入了解实现细节来回答这个问题,我建议您在replicator的源代码中找到答案每当您打开事务并对集合执行命令时,这些命令都会在TStore(集合)中获取锁并记录到事务临时字典中(更改跟踪)以及事务日志,然后replicator将这些更改转发给副本

执行
tx.CommitAsync()
后,临时记录将保存到磁盘,事务将在日志中注册,然后复制到辅助副本以提交并保存到磁盘,然后释放锁

如果未修改集合,则事务将没有任何要保存\复制的内容,只会关闭事务

如果在操作后未调用
tx.CommitAsync()
,事务将中止,任何挂起的操作(如果有)将被丢弃,中止操作将写入日志以通知其他副本

在这两种情况下,Commit和Abort都将生成日志(并复制它们),我不确定的唯一细节是这些日志是否也是在没有任何更改的情况下生成的,我假设它们是。关于性能,读取或试图更改集合的行为将获得锁,需要通过提交或中止来释放,我认为这些对您的代码影响最大,因为它们将阻止其他thr在你没有完成交易的时候修改它是很困难的。在这种情况下,我不会太担心提交一个空的交易

   // 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
你可以在这个网站上找到这些细节


如果您真的想深入了解实现细节来回答这个问题,我建议您在replicator的源代码中找到答案

谢谢Diego。我的问题是关于集合未修改但事务已提交时的性能影响。我已经用一点额外的信息更新了答案,除此之外,其他信息都没有了据我所知,我已经添加了一个到replicator源代码的链接,我想你会在那里找到其余的答案,或者等待SF团队的人给出更好的答案。“我不会太担心提交一个空事务。”.我现在投票支持你,因为我认为你提供了很好的信息,并且倾向于同意不应该有任何重大的绩效影响。我将看看SF团队是否会做出适当的回答和评分。再次感谢你。确认一般观点:没有变化时,调用Commit不会产生任何开销或问题。SF指导将始终显式调用提交或中止,即使没有任何更改。谢谢Diego。我的问题是当集合未修改但事务已提交时的性能影响。我已经用一些额外的信息更新了答案,除此之外,我不知道,我已经添加了一个到replicator源代码的链接,我想您会的在那里找到剩下的答案,或者等待SF团队的人给出更好的答案。“我不会太担心提交一个空交易。”.我现在投票支持你,因为我认为你提供了很好的信息,并且倾向于同意不应该有任何重大的绩效影响。我将看看SF团队是否会做出适当的回答和评分。再次感谢你。确认一般观点:没有变化时,调用Commit不会产生任何开销或问题。SF指导将要始终显式调用Commit或Abort,即使没有任何更改。