我相信所有基于线程的同步原语在隐式事务中都是无用的。鉴于班级:
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();
}
问题是,即使使用
配置等待(真)
,不能保证返回同一线程。因此,当事务可以在不同的线程上完成时,当它调用易失性资源的提交或回滚方法以及退出锁的时间时,它(通常)在不同的线程上,而不是当您进入锁时。
完全没有办法开锁,你很快就被锁上了。在利用async/await模式的体系结构中,readerwriterlockslim和其他原语似乎是非常无用的。我是不是漏掉了一些显而易见的东西?