public void TestScopedToTransactionOnly() { using var connection = SqlHelpers.CreateConnection(ConnectionStringProvider.ConnectionString); connection.Open(); using (var transaction = connection.BeginTransaction()) using (TransactionProvider.UseTransaction(transaction)) using (var transactionEngine = new TEngineFactory().Create <TTransactionProvider>()) { var lockName = nameof(TestScopedToTransactionOnly); using (transactionEngine.CreateLock(lockName).Acquire()) { using (var handle = transactionEngine.CreateLock(lockName).TryAcquire()) { (handle != null).ShouldEqual(transactionEngine.IsReentrant, "reentrant: " + this.GetType().Name); } using (ConnectionProvider.UseConnection(connection)) using (var connectionEngine = new TEngineFactory().Create <DefaultClientConnectionProvider>()) { Assert.Catch <InvalidOperationException>(() => connectionEngine.CreateLock(lockName).TryAcquire()); } } } }
public void TestCloseTransactionLockOnClosedConnection() { using (var connection = new SqlConnection(ConnectionStringProvider.ConnectionString)) { connection.Open(); using (var transaction = connection.BeginTransaction()) using (TransactionProvider.UseTransaction(transaction)) using (var transactionEngine = new TEngineFactory().Create <TransactionProvider>()) using (var connectionStringEngine = new TEngineFactory().Create <DefaultConnectionStringProvider>()) { var lockName = nameof(TestCloseTransactionLockOnClosedConnection); var @lock = transactionEngine.CreateLock(lockName); var handle = @lock.Acquire(); // use connectionStringEngine to avoid reentrance connectionStringEngine.CreateLock(lockName).IsHeld().ShouldEqual(true); connection.Dispose(); TestHelper.AssertDoesNotThrow(handle.Dispose); // lock can be re-acquired connectionStringEngine.CreateLock(lockName).IsHeld().ShouldEqual(false); } } }
public void TestCloseTransactionLockOnClosedTransaction() { using var connectionStringEngine = new TEngineFactory().Create <DefaultConnectionStringProvider>(); using var connection = SqlHelpers.CreateConnection(ConnectionStringProvider.ConnectionString); connection.Open(); var lockName = nameof(TestCloseTransactionLockOnClosedTransaction); IDisposable handle; using (var transaction = connection.BeginTransaction()) using (TransactionProvider.UseTransaction(transaction)) using (var transactionEngine = new TEngineFactory().Create <TTransactionProvider>()) { handle = transactionEngine.CreateLock(lockName).Acquire(); connectionStringEngine.CreateLock(lockName).IsHeld().ShouldEqual(true); } Assert.DoesNotThrow(handle.Dispose); connectionStringEngine.CreateLock(lockName).IsHeld().ShouldEqual(false); }
private void TestLockOnCompletedTransactionHelper(Action <DbTransaction> complete, [CallerMemberName] string lockName = "") { using var connectionStringEngine = new TEngineFactory().Create <DefaultConnectionStringProvider>(); using var connection = SqlHelpers.CreateConnection(ConnectionStringProvider.ConnectionString); connection.Open(); using (var transaction = connection.BeginTransaction()) using (TransactionProvider.UseTransaction(transaction)) using (var transactionEngine = new TEngineFactory().Create <TTransactionProvider>()) { var handle = transactionEngine.CreateLock(lockName).Acquire(); connectionStringEngine.CreateLock(lockName).IsHeld().ShouldEqual(true); complete(transaction); Assert.DoesNotThrow(handle.Dispose); connectionStringEngine.CreateLock(lockName).IsHeld().ShouldEqual(false, this.GetType().Name); Assert.Catch <InvalidOperationException>(() => transactionEngine.CreateLock(lockName).Acquire()); } }