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外打开时,临时表插入后查询,将无任何数据。

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

你可能感兴趣的:(transaction)