public SqlPersistenceEngine(
            IConnectionFactory connectionFactory,
            ISqlDialect dialect,
            ISerialize serializer,
            TransactionScopeOption scopeOption,
            int pageSize)
        {
            if (connectionFactory == null)
            {
                throw new ArgumentNullException("connectionFactory");
            }

            if (dialect == null)
            {
                throw new ArgumentNullException("dialect");
            }

            if (serializer == null)
            {
                throw new ArgumentNullException("serializer");
            }

            if (pageSize < 0)
            {
                throw new ArgumentException("pageSize");
            }

            _connectionFactory = connectionFactory;
            _dialect           = dialect;
            _serializer        = serializer;
            _scopeOption       = scopeOption;
            _pageSize          = pageSize;

            Logger.Debug(Messages.UsingScope, _scopeOption.ToString());
        }
Beispiel #2
0
        public static void Test1()
        {
            Console.WriteLine("\r\n==================\r\nCalling MyTrans.Test1()");

            //string connStr = Manager.GetConnStringOfOra1();
            string connStr = string.Format("Data Source={0};User ID={1};Password={2};Persist Security Info=True;Pooling=true",
                                           "bhdevcomber", //Helper.GetDatasource4OraTNS("192.168.100.52", "1521", "bhdevcomber"), //
                                           "bhdata",
                                           "bhdata");

            DbAccess db = new DbAccess(connStr);

            Console.WriteLine("Last - 0:{0}", db.SelectCreateTimeByCode("0"));
            Console.WriteLine("Last - 1:{0}", db.SelectCreateTimeByCode("1"));
            Console.WriteLine("Last - 2:{0}", db.SelectCreateTimeByCode("2"));
            Console.WriteLine("Last -22:{0}", db.SelectCreateTimeByCode("22"));
            Console.WriteLine("Last - 3:{0}", db.SelectCreateTimeByCode("3"));
            Console.WriteLine("------------------");

            try
            {
                bool commit;
                using (MyTransactionScope scope = new MyTransactionScope(new TimeSpan(0, 1, 20)))
                {
                    try
                    {
                        db.DeleteByCode("0");
                        db.Insert("0", "zero");
                        Console.WriteLine("Insert - 0:{0}", db.SelectCreateTimeByCode("0"));
                        //db.CreateTable();
                        //db.Insert("0", "zero1");
                        commit = true;
                    }
                    catch (Exception ex1)
                    {
                        Console.WriteLine(ex1.ToString());
                        commit = false;
                    }

                    TransactionScopeOption scopeOption1 = TransactionScopeOption.RequiresNew;
                    TransactionScopeOption scopeOption2 = TransactionScopeOption.Suppress;
                    #region Scope1
                    using (MyTransactionScope scope1 = new MyTransactionScope(scopeOption1))
                    {
                        Console.WriteLine("scope1.{0}\r\n{{", scopeOption1.ToString());
                        bool succeed1 = false;
                        try
                        {
                            Console.WriteLine("Read   - 0:{0}", db.SelectCreateTimeByCode("0"));
                            db.DeleteByCode("1");
                            db.Insert("1", "one");
                            Console.WriteLine("Insert - 1:{0}", db.SelectCreateTimeByCode("1"));

                            db.Insert("0", "zero2");
                            //Console.WriteLine("Insert-0:{0}", db.SelectByCode("0"));

                            succeed1 = true;
                        }
                        catch (Exception ex2)
                        {
                            Console.WriteLine(ex2.ToString());
                        }

                        #region Scope2
                        Console.WriteLine("scope2.{0}\r\n{{", scopeOption2.ToString());
                        using (MyTransactionScope scope2 = new MyTransactionScope(scopeOption2))
                        {
                            bool succeed2 = false;
                            try
                            {
                                Console.WriteLine("Read   - 0:{0}", db.SelectCreateTimeByCode("0"));
                                Console.WriteLine("Read   - 1:{0}", db.SelectCreateTimeByCode("1"));

                                db.DeleteByCode("2");
                                db.Insert("2", "two");
                                Console.WriteLine("Insert - 2:{0}", db.SelectCreateTimeByCode("2"));

                                throw new Exception("test");
                                db.DeleteByCode("22");
                                db.Insert("22", "two-two");
                                Console.WriteLine("Insert - 3:{0}", db.SelectCreateTimeByCode("3"));

                                succeed2 = true;
                            }
                            catch (Exception ex2)
                            {
                                Console.WriteLine(ex2.ToString());
                            }

                            //Suppress不需要提交
                            if (scopeOption2 != TransactionScopeOption.Suppress && succeed2)
                            {
                                scope2.Complete();
                                Console.WriteLine("scope2.Complete()\r\n}");
                            }
                            else
                            {
                                Console.WriteLine("}");
                            }
                        }
                        #endregion

                        //Suppress不需要提交
                        if (scopeOption1 != TransactionScopeOption.Suppress && succeed1)
                        {
                            scope1.Complete();
                            Console.WriteLine("scope1.Complete()\r\n}");
                        }
                        else
                        {
                            Console.WriteLine("}");
                        }
                    }
                    #endregion

                    TransactionScopeOption scopeOption3 = TransactionScopeOption.RequiresNew;
                    using (MyTransactionScope scope3 = new MyTransactionScope(scopeOption3))
                    {
                        Console.WriteLine("scope3.{0}\r\n{{", scopeOption3.ToString());
                        bool succeed3 = false;
                        try
                        {
                            Console.WriteLine("Read   - 0:{0}", db.SelectCreateTimeByCode("0"));
                            Console.WriteLine("Read   - 1:{0}", db.SelectCreateTimeByCode("1"));
                            Console.WriteLine("Read   - 2:{0}", db.SelectCreateTimeByCode("2"));

                            db.DeleteByCode("3");
                            db.Insert("3", "three");
                            Console.WriteLine("Insert - 3:{0}", db.SelectCreateTimeByCode("3"));

                            succeed3 = true;
                        }
                        catch (Exception ex3)
                        {
                            Console.WriteLine(ex3.ToString());
                        }

                        //Suppress不需要提交
                        if (scopeOption3 != TransactionScopeOption.Suppress && succeed3)
                        {
                            scope3.Complete();
                            Console.WriteLine("scope3.Complete()\r\n}");
                        }
                        else
                        {
                            Console.WriteLine("}");
                        }
                    }


                    //if (commit)
                    //{
                    //    try
                    //    {
                    //        db.Insert("1", "first1");
                    //    }
                    //    catch (Exception ex1)
                    //    {
                    //        commit = false;
                    //        Console.WriteLine(ex1.ToString());
                    //    }
                    //}

                    if (commit)
                    {
                        scope.Complete();
                        Console.WriteLine("Complete()");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Trans Error:" + ex.ToString());
            }

            Console.WriteLine("------------------");
            Console.WriteLine("Final - 0:{0}", db.SelectCreateTimeByCode("0"));
            Console.WriteLine("Final - 1:{0}", db.SelectCreateTimeByCode("1"));
            Console.WriteLine("Final - 2:{0}", db.SelectCreateTimeByCode("2"));
            Console.WriteLine("Final -22:{0}", db.SelectCreateTimeByCode("22"));
            Console.WriteLine("Final - 3:{0}", db.SelectCreateTimeByCode("3"));
        }
Beispiel #3
0
 public static ITransactionScope CreateTransactionScope(TransactionScopeOption option)
 {
     return(CreateTransactionScope(option.ToString().To <DbTransactionScopeOption>()));
 }
Beispiel #4
0
        /*
         * [关键点]
         *  1)事务环境是在conn.Open()时生效
         *
         * RequiresNew
         *   特性:
         *     1)查询时,是事务未提交前的数据环境(如,在外层事务中执行了数据修改,查询到的还会是修改前的内容)。
         * Suppress
         *   特性:
         *     1)不需要调用Complete()提交,因为在其范围内的每个数据库操作都会直接提交。
         *     2)查询时,是事务未提交前的数据环境(如,在外层事务中执行了数据修改,查询到的还会是修改前的内容)。
         *   应用场景:
         *     1)DDL语句不能放到事务中(因为会立即COMMIT)
         *     2)在事务内提交错误日志
         *
         * [疑问]
         *  1)TNS方式的连接串conn.Open()放在事务中,会导致进程崩溃?
         */
        public static void Test1()
        {
            //string connStr = Manager.GetConnStringOfOra1();
            string connStr = string.Format("Data Source={0};User ID={1};Password={2};Persist Security Info=True;Pooling=true",
                                           "bhdevcomber", //Helper.GetDatasource4OraTNS("192.168.100.52", "1521", "bhdevcomber"), //
                                           "bhdata",
                                           "bhdata");

            using (OracleConnection conn = new OracleConnection(connStr))
            {
                Console.WriteLine("Last-0:{0}", SelectByCode(conn, "0"));
                Console.WriteLine("Last-1:{0}", SelectByCode(conn, "1"));
                Console.WriteLine("------------------");

                try
                {
                    bool commit = false;
                    TransactionOptions transOption = new TransactionOptions();
                    transOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
                    transOption.Timeout        = new TimeSpan(0, 0, 20);
                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transOption))
                    {
                        try
                        {
                            DeleteByCode(conn, "1");
                            Insert(conn, "1", "first");
                            //CreateTable(conn);
                            commit = true;
                            Console.WriteLine("Exec-1:{0}", SelectByCode(conn, "1"));
                        }
                        catch (Exception ex1)
                        {
                            Console.WriteLine(ex1.ToString());
                        }

                        TransactionScopeOption scopeOption = TransactionScopeOption.Suppress;
                        using (TransactionScope scope1 = new TransactionScope(scopeOption))
                        {
                            Console.WriteLine("scope1.{0}\r\n{{", scopeOption.ToString());

                            bool succeed = false;
                            try
                            {
                                DeleteByCode(conn, "0");
                                Insert(conn, "0", "-");
                                Console.WriteLine("Exec-0:{0}", SelectByCode(conn, "0"));
                                Console.WriteLine("Exec-1:{0}", SelectByCode(conn, "1"));

                                //Insert(conn, "1", "A");
                                //Console.WriteLine("Exec-1:{0}", SelectByCode(conn, "1"));

                                succeed = true;
                            }
                            catch (Exception ex2)
                            {
                                Console.WriteLine(ex2.ToString());
                            }

                            //Suppress不需要提交
                            if (scopeOption != TransactionScopeOption.Suppress && succeed)
                            {
                                scope1.Complete();
                                Console.WriteLine("scope1.Complete()\r\n}");
                            }
                            else
                            {
                                Console.WriteLine("}");
                            }
                        }

                        if (commit)
                        {
                            scope.Complete();
                            Console.WriteLine("Complete()");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Trans Error:" + ex.ToString());
                }

                Console.WriteLine("------------------");
                Console.WriteLine("Final-0:{0}", SelectByCode(conn, "0"));
                Console.WriteLine("Final-1:{0}", SelectByCode(conn, "1"));
            }
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="transactionScopeOption">An instance of the System.Transactions.TransactionScopeOption enumeration that describes the transaction requirements associated with this transaction scope.</param>
        /// <param name="isolationLevel">the isolation level of the transaction.</param>
        /// <param name="timeout">the timeout period for the transaction.</param>
        public TransactionScope(TransactionScopeOption transactionScopeOption, IsolationLevel isolationLevel, TimeSpan timeout)
        {
            TransactionOptions options = new TransactionOptions();
            options.IsolationLevel = (System.Transactions.IsolationLevel)Enum.Parse(typeof(System.Transactions.IsolationLevel), isolationLevel.ToString());
            options.Timeout = timeout;

            System.Transactions.TransactionScopeOption transactionScopeOptionValue = (System.Transactions.TransactionScopeOption)Enum.Parse(typeof(System.Transactions.TransactionScopeOption), transactionScopeOption.ToString());
            this.transactionScope = new System.Transactions.TransactionScope(transactionScopeOptionValue, options);
            TransactionScopeContext.Increase();
        }