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外打开时,临时表插入后查询,将无任何数据。
此仅作为笔记先记录下来,后续分析原因。