码迷,mamicode.com
首页 > 其他好文 > 详细

TransactionScrope

时间:2015-03-03 11:36:57      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

测这个东西其实是由生产环境数据库报错,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外打开时,临时表插入后查询,将无任何数据。

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

TransactionScrope

标签:

原文地址:http://www.cnblogs.com/HansonYao/p/4310415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!