zoukankan      html  css  js  c++  java
  • 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外打开时,临时表插入后查询,将无任何数据。

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

  • 相关阅读:
    2016 Multi-University Training Contest 1 solutions BY HIT
    Unicode 码表
    用 lambda 表达式 对 List 进行排序
    Linux的sed命令介绍
    Linux下的NTP服务搭建
    Linux网络配置(ip命令及配置文件)
    Linux的bash脚本编程(if语句和循环语句)
    Linux新手必须掌握的命令(2)
    Linux的文件查找
    bash中的变量
  • 原文地址:https://www.cnblogs.com/HansonYao/p/4310415.html
Copyright © 2011-2022 走看看