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外打开时,临时表插入后查询,将无任何数据。
此仅作为笔记先记录下来,后续分析原因。
TransactionScrope的更多相关文章
- TransactionScrope 2
继上一篇文章TransactionScrope 在做相应的变动时,发现可以重现ORA-14450错误,如: List<Thread> ls = new List<Thread> ...
随机推荐
- ORACLE SQL 组函数【weber出品必属精品】
组函数:对一组数据进行加工,每组数据返回一个值 常用的组函数:count() avg() max() min() sum() count()函数 1. count(*) :返回总共的行 ...
- Array.prototype.sort()
sort() 方法对数组的元素做原地的排序,并返回这个数组.默认按照字符串的Unicode码位点(code point)排序. 语法 arr.sort([compareFunction]) 参数 co ...
- C#代码设置窗体和Panel的位置大小
1.设置Panel位置大小 private void button2_Click(object sender, EventArgs e) { panel1.Visible = false; panel ...
- MFC的初始化过程和消息映射技术
1.删除#include <windows.h>--win32中的-(使用win32工程编程mfc必须删除) 添加#include <afxwin.h> -- mfc中的- 2 ...
- hdu5351 MZL's Border(规律题,java)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud MZL's Border Time Limit: 2000/1000 MS (Ja ...
- mysql索引之组合索引
多列索引又称组合索引,在mysql的查询操作中,我们经常会遇到多个搜索条件,如:$sql = "select * from article where content='ma4' and t ...
- 分治算法求乘方a^b 取余p(divide and conquer)
传统的计算方法为循环n个a相乘.时间复杂度为O(n). 如用分治算法,效率可提升至O(lgn). 结合recursive有 double pow(int a, int n){ ) ; ) return ...
- IC封装图片认识(一):BGA
在上篇文章<常用IC封装技术介绍>第一个提到的IC封装形式就是BGA,全称是Ball Grid Array(球栅阵列结构的PCB),它是集成电路采用有机载板的一种封装法.其具有以下五个特点 ...
- TXMLDocument换行的两种方案
手写代码: XML格式化使用msxml引擎,Delphi代码如下: Delphi/Pascal code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 《Programming WPF》翻译 第7章 4.转换
原文:<Programming WPF>翻译 第7章 4.转换 支持高分辨率显示是WPF中的重要样式.这是被部分地支持--强调了可伸缩的向量图,而不是图像.但是,正如使用GDI+和GDI3 ...