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

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

  • 相关阅读:
    通过TortoiseGit上传项目到GitHub
    删除右键菜单中的Git Gui Here、Git Bash Here的方法
    block functions区块函数插件的定义与使用
    modifiers标量调节器插件的定义和使用
    functions函数插件的定义和使用
    smarty内置函数、自定义函数
    smarty类与对象的赋值与使用
    Smarty模板的引用
    Smarty的循环
    Smarty的条件判断语句
  • 原文地址:https://www.cnblogs.com/HansonYao/p/4310415.html
Copyright © 2011-2022 走看看