Since I want the transaction we're creating to take the lock when created I also want to release the lock when the transaction is disposed:

1: public class When_using_a_transaction 2: { 3: class FakeLock : Lock 4: { 5: public bool IsLocked { get; private set; } 6:   7: public FakeLock() 8: { 9: IsLocked = false; 10: } 11:   12: public void Lock() 13: { 14: IsLocked = true; 15: } 16:   17: public void Unlock() 18: { 19: IsLocked = false; 20: } 21: } 22:   23: private FakeLock _lock; 24:   25: public When_using_a_transaction() 26: { 27: _lock = new FakeLock(); 28: } 29:   30: [Fact] 31: void It_should_take_lock_when_created() 32: { 33: Assert.False(_lock.IsLocked); 34: using (Transaction transaction = new Transaction(_lock)) 35: { 36: Assert.True(_lock.IsLocked); 37: } 38: } 39:   40: [Fact] 41: void It_should_release_lock_when_leaving_scope() 42: { 43: using (Transaction transaction = new Transaction(_lock)) 44: { 45: Assert.True(_lock.IsLocked); 46: } 47: Assert.False(_lock.IsLocked); 48: } 49: }

And the transaction implementation:

1: public class Transaction : IDisposable 2: { 3: private readonly Lock _lock; 4:   5: public Transaction() 6: : this(new MutexLock()) 7: { 8:   9: } 10:   11: public Transaction(Lock aLock) 12: { 13: _lock = aLock; 14: _lock.Lock(); 15: } 16:   17: public void Dispose() 18: { 19: _lock.Unlock(); 20: } 21: }