TransactionScrope

测这个东西其实是由生产环境数据库报错,ORA-14450错误。

测试结果是:

1)使用transactionscrope时,数据库连接打开需在scrope内打开;

2)TransactionScopeOption.Suppress 是无事务(原有同事非得说是原子事务,证明给他看)。

不多说了,代码上来:

create global temporary table TMP_TEST
(
  COL1 VARCHAR2(200)
)
on commit delete rows;

由于是使用的是Oracle 所以添加引用System.Date.OracleClient,且添加System.Transactions的引用;

OracleConnection con = new OracleConnection();
            con.ConnectionString = ConfigurationManager.ConnectionStrings["MB.MBERP"].ConnectionString;


            try
            {
                con.Open();

                #region DBTransaction
                var tran = con.BeginTransaction();

                OracleCommand cmd1 = new OracleCommand("insert into TMP_TEST values('" + DateTime.Now + "')", con, tran);
                var result = cmd1.ExecuteNonQuery();


                OracleCommand cmd2 = new OracleCommand("select COL1 from tmp_test", con, tran);
                var t = cmd2.ExecuteOracleScalar();

                tran.Commit();
                con.Close();
                Console.WriteLine("受影响的行数:" + result + "||当前临时表数量:" + t);

                #endregion
                using (TransactionScope scop1 = new TransactionScope())
                {
                    OracleCommand cmd4 = new OracleCommand("insert into TMP_TEST values('" + DateTime.Now + "')", con, tran);
                    con.Open();
                    var result3 = cmd4.ExecuteNonQuery();
                    con.Close();
                    using (TransactionScope scop = new TransactionScope(TransactionScopeOption.Required))
                    {
                        OracleCommand cmd = new OracleCommand("insert into TMP_TEST values('" + DateTime.Now + "')", con, tran);
                        con.Open();


                        var result2 = cmd.ExecuteNonQuery();

                        OracleCommand cmd3 = new OracleCommand("select COL1 from tmp_test", con);
                        var t2 = cmd3.ExecuteOracleScalar();
                        Console.WriteLine("2受影响的行数:" + result + "||当前临时表数量:" + t2);
                        
                        
                        OracleDataAdapter da = new OracleDataAdapter("select  * from TMP_TEST", con);
                        DataTable dt = new DataTable();
                        da.Fill(dt);
                        Console.WriteLine("3受影响的行数:" + result2 + "||当前临时表数量:" + dt.Rows.Count);
                        scop.Complete();
                    } 
                }
                con.Close();
            }
            catch (Exception)
            {

                throw;
            }

第二个transactionscrope 使用默认的即required结果为

第二个transactionscrope 使用RequiresNew时结果为

第二个transactionscrope 使用suppress时结果为

由此可以看出测试结果。

另:由上解释 如果con在transactionscrope外打开时,临时表插入后查询,将无任何数据。

此仅作为笔记先记录下来,后续分析原因。

posted @ 2015-03-03 10:52  HansonYao  阅读(397)  评论(0编辑  收藏  举报