同步原语在带有异步/等待调用的TransactionScopes中是否没有用?

时间:2018-12-19 23:15:40

标签: async-await transactionscope readerwriterlockslim

我相信所有基于线程的同步原语在隐式事务中都是无用的。给定班级:

public class Country : IEnlistNotification
{
  public ReaderWriterLockSlim Lock { get; } = new ReaderWriterLockSlim();
  public void Commit(Enlistment enlistment)
  {
      this.Lock.ExitWriteLock();
  }
}

我有以下代码:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
  Country country = new Country();
  Transaction.Current.EnlistVolatile(country, EnlistmentOptions.None);
  country.Lock.EnterWriteLock();

  await dbContext.Countries.AddAsync(newCountry).ConfigureAwait(true);
  await dbContext.SaveChangesAsync().ConfigureAwait(true);

  transactionScope.Complete();
}

问题在于,即使使用 ConfigureAwait(true),也不能保证您返回同一线程。因此,尽管事务可以在不同的线程上完成,但是当它调用易失性资源的Commit或Rollback方法并且需要退出锁时,它(通常)与输入锁时在不同的线程上。

绝对没有办法解除锁定,您很快就会陷入僵局。在利用async / await模式的体系结构中,ReaderWriterLockSlim和其他原语似乎毫无用处。我缺少明显的东西吗?

0 个答案:

没有答案