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());
                                }
                        }
                    }
        }
Esempio n. 2
0
        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());
                    }
        }