CreateTransactionScope() public static method

새로운 TransactionScope 를 생성한다.
public static CreateTransactionScope ( TransactionScopeOption scopeOption = TransactionScopeOption.Required, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted ) : TransactionScope
scopeOption TransactionScopeOption TransactionScopeOption 값
isolationLevel IsolationLevel Transaction 격리수준
return TransactionScope
        public void TransactionScope_ShouldNotPromoteToDTC2()
        {
            TestTool.RunTasks(10,
                              () => {
                using (var txScope = AdoTool.CreateTransactionScope()) {
                    var count = TotalCount();

                    var ds = NorthwindAdoRepository.ExecuteDataSetBySqlString(SQL_REGION_SELECT, 1, 10);
                    var dt = NorthwindAdoRepository.ExecuteDataTableBySqlString(SQL_REGION_SELECT, 1, 10);

                    Assert.IsFalse(ds.Tables[0].HasErrors);
                    Assert.IsFalse(dt.HasErrors);

                    int rows = NorthwindAdoRepository.ExecuteNonQueryBySqlString(SQL_REGION_INSERT);
                    Assert.AreEqual(1, rows);
                    rows = NorthwindAdoRepository.ExecuteNonQueryBySqlString(SQL_REGION_INSERT2);
                    Assert.AreEqual(1, rows);

                    NorthwindAdoRepository.ExecuteNonQueryBySqlString(SQL_REGION_DELETE);

                    ds = NorthwindAdoRepository.ExecuteDataSetBySqlString(SQL_REGION_SELECT);
                    dt = NorthwindAdoRepository.ExecuteDataTableBySqlString(SQL_REGION_SELECT);

                    txScope.Complete();
                }
            });
        }
Beispiel #2
0
        /// <summary>
        /// 지정된 Action 들을 하나의 Transaction Scope로 묶어서 처리합니다.
        /// </summary>
        /// <param name="actionToExecute">실행할 Action</param>
        /// <example>
        ///	<code>
        ///		// 한 Tx안에서 3개의 Action 를 수행합니다.
        ///		With.TransactionScope(TransactionScopeOption.Required,
        ///                           System.Transactions.IsolationLevel.ReadCommited,
        ///                           FindAll_By_DetachedCriteria,
        ///                           FindAll_By_Criterion,
        ///                           FindAll_By_Example);
        /// </code>
        /// </example>
        public static void TransactionScope(Action actionToExecute)
        {
            actionToExecute.ShouldNotBeNull("actionToExecute");

            using (var txScope = AdoTool.CreateTransactionScope()) {
                actionToExecute();
                txScope.Complete();
            }
        }
Beispiel #3
0
        /// <summary>
        /// Database 작업을 테스트하기 위한 Utility 함수이다.<br/>
        /// 지정된 테스트용 DB 작업이 실제 Database에서 실행은 되지만 Transaction이 Commit이 되지 않으므로, 테스트시에 유용한다.
        /// </summary>
        /// <param name="actionToTest">테스트할 Action</param>
        /// <param name="options">TransactionScopeOption</param>
        /// <example>
        /// // ForTesting 의 anonymous method가 실행되지만 실제 DB에 commit 되지는 않습니다.
        /// <code>
        /// var originalCount = Convert.ToInt32(AdoRepository.ExecuteScalar(CountString));
        /// AdoWith.ForTesting(delegate
        ///		{
        ///			AdoRepository.ExecuteNonQuery(InsertString);
        ///			AdoRepository.ExecuteNonQuery(InsertString2);
        ///			var count = Convert.ToInt32(AdoRepository.ExecuteScalar(CountString));
        ///
        ///			Assert.AreEqual(originalCount + 2, count);
        ///		});
        ///
        /// var rollbackCount = Convert.ToInt32(AdoRepository.ExecuteScalar(CountString));
        /// Assert.AreEqual(originalCount, rollbackCount);
        /// </code>
        /// </example>
        public static void ForTesting(this Action actionToTest, TransactionScopeOption options = TransactionScopeOption.RequiresNew)
        {
            actionToTest.ShouldNotBeNull("actionToTest");

            using (var scope = AdoTool.CreateTransactionScope(options)) {
                actionToTest();

                // NOTE: 테스트를 위해 수행한 것이므로, scope.Complete()를 호출하여 Transaciton을 Commit 하지 않는다. (즉 Rollback 한다)
            }

            if (IsDebugEnabled)
            {
                log.Debug("Execute {0}() for testing, and rollback!!!", actionToTest.Method.Name);
            }
        }
        public void TransactionScope_ShouldNotPromoteToDTC()
        {
            int totalRows = TotalRows();
            int dtcCount  = 0;

            TransactionManager.DistributedTransactionStarted += delegate { Interlocked.Increment(ref dtcCount); };

            using (var ts = AdoTool.CreateTransactionScope()) {
                int rows = NorthwindAdoRepository.ExecuteNonQueryBySqlString(SQL_REGION_INSERT);
                Assert.AreEqual(1, rows);
                rows = NorthwindAdoRepository.ExecuteNonQueryBySqlString(SQL_REGION_INSERT2);
                Assert.AreEqual(1, rows);

                ts.Complete();
            }
            Assert.AreEqual(totalRows + 2, TotalRows());
            Assert.AreEqual(0, dtcCount);
        }
Beispiel #5
0
        /// <summary>
        /// 지정된 Action 들을 하나의 Transaction Scope로 묶어서 처리합니다.
        /// </summary>
        /// <param name="scopeOption">TransactionScopeOption 값</param>
        /// <param name="isolationLevel">Transaction 격리수준</param>
        /// <param name="actionsToExecute">TransactionScope 안에서 실행할 Action(s).</param>
        /// <example>
        ///	<code>
        ///		// 한 Tx안에서 3개의 Action 를 수행합니다.
        ///		With.TransactionScope(TransactionScopeOption.Required,
        ///                           System.Transactions.IsolationLevel.ReadCommited,
        ///                           FindAll_By_DetachedCriteria,
        ///                           FindAll_By_Criterion,
        ///                           FindAll_By_Example);
        /// </code>
        /// </example>
        public static void TransactionScope(TransactionScopeOption scopeOption,
                                            IsolationLevel isolationLevel,
                                            params Action[] actionsToExecute)
        {
            if (IsDebugEnabled)
            {
                log.Debug("TransactionScope 안에서, 지정한 Action 들을 실행하기 위해 준비합니다.");
            }

            if (actionsToExecute == null)
            {
                if (IsDebugEnabled)
                {
                    log.Debug("실행할 Action이 제공되지 않아 반환합니다.");
                }

                return;
            }

            int dtcCount = 0;

            TransactionManager.DistributedTransactionStarted += delegate { dtcCount++; };

            using (var txScope = AdoTool.CreateTransactionScope(scopeOption, isolationLevel)) {
                foreach (Action action in actionsToExecute)
                {
                    if (action != null)
                    {
                        action();
                    }
                }

                txScope.Complete();
            }

            if (IsDebugEnabled)
            {
                log.Debug("TransactionScope 내에서 Action 들을 실행에 성공했습니다. DTC count=[{0}]", dtcCount);
            }
        }
Beispiel #6
0
        /// <summary>
        /// Database 작업을 테스트하기 위한 Utility 함수이다.<br/>
        /// 지정된 테스트용 DB 작업이 실제 Database에서 실행은 되지만 Transaction이 Commit이 되지 않으므로, 테스트시에 유용한다.
        /// </summary>
        /// <remarks>
        /// Database 작업에 대해, 실제 DB에 적용은 되지 않고, 테스트만을 하기 원할 때 사용합니다.
        /// </remarks>
        /// <param name="actionsToTest">테스트할 Action 시퀀스</param>
        /// <param name="isolationLevel">Transaction isolation level</param>
        /// <example>
        /// <code>
        /// // ForTesting 의 anonymous method가 실행되지만 실제 DB에 commit 되지는 않습니다.
        /// IList{Action} actions = new List{Action}();
        ///
        /// actions.Add(DeleteActionTest);
        /// actions.Add(InsertActionTest);
        /// actions.Add(DeleteActionTest);
        /// actions.Add(InsertActionTest);
        ///
        /// var originalCount = TotalCount();
        ///
        /// actions.ForTesting(AdoTool.AdoIsolationLevel);
        ///
        /// Assert.AreEqual(originalCount, TotalCount());
        /// </code>
        /// </example>
        public static void ForTesting(this IEnumerable <Action> actionsToTest, IsolationLevel isolationLevel)
        {
            actionsToTest.ShouldNotBeNull("actions");

            using (var scope = AdoTool.CreateTransactionScope(TransactionScopeOptionForTesting, isolationLevel)) {
                foreach (var action in actionsToTest.Where(action => action != null))
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("Execute {0}() for testing...", action.Method.Name);
                    }

                    action();
                }

                //! NOTE: 테스트를 위해 수행한 것이므로, scope.Complete()를 호출하여 Transaciton을 Commit 하지 않는다. (즉 Rollback 한다)
            }

            if (IsDebugEnabled)
            {
                log.Debug("Execute {0} actions for testing and rollback.", actionsToTest.Count());
            }
        }