我相信所有基于线程的同步原语在隐式事务中都是无用的。给定班级:
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和其他原语似乎毫无用处。我缺少明显的东西吗?