问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于C# 中事务的写法

发布网友 发布时间:2022-04-07 17:00

我来回答

1个回答

热心网友 时间:2022-04-07 18:29

.net的事务分为两种,一种是企业事务,一种是数据库事务。企业事务在System.Enterprise空间中,这个多用于与外部网络接口之间的等待,它是通过建立快照(很多东西其实是不能恢复的),另一种是数据库事务。楼主用的就是数据库事务,数据库事务严格来说并不属于.net,它其实是真正的数据库事务的一种包装形式。比如SqlTransaction trans = Conn.BeginTransction();这句在执行时相当于向数据库发送了Begin trans指令,这种情况下会指导在此时的时间段内,该条连接(相当于scope)不允许执行其他的语句。换句话来说,在trans执行commit或rollback之前,该条连接只为事务独占,不可能再执行其他的命令。

换种理解思路你会更明白——conn.BeginTransction() 之后,conn在执行其命令都算是事务的一部分,直到trans提交或回滚。

SqlTransaction trans = conn.BeginTransction();
try
{
    SqlCommand comm1 = Conn.CreateCommand(sqlString);
    comm1.ExecuteNonQuery();
    SqlCommand comm2 = new SqlCommand(sqlString2, conn)
    comm2.ExecuteNonQuery();
    // 提交事务
    trans.Commit();
 }catch
 {
    trans.Rollback();
 }

以上语句中存在两个sqlcomm都在同一事务内执行。两个命令两种形式是等效的。

这里面有两个注意点,开始事务必须在打开的连接上,如果连接未打开的情况下是会引发错误的,也就是说conn.BeginTransction()语句执行的前替条件是conn处于open状态。所以如果能打开事务,不必要再进行conn.open()了!当然这不是楼主的错误,楼主的错误体现在另一个方面new SqlCommand(string sqltext, Connection conn, SqlTransction trans)方法的用途并不是这么用的。你代码中出现这个方法,其实new SqlCommand(string sqltext, Connection conn)如果conn在事务的标记下,该命令在执行已经做为事务的一部分了(conn标记事务后,没有提交或回滚时,该条连接上执行的所有命令都是事务命令,你可以查看代码上方的理论解释,这样有助于你的学习)。而且再使用一个trans参数传入,会被认为是另一个事务,换句话来说,这句语句在其中一个事务中执行(conn标记的事务上),同时被要求在另一个事务(传入的trans)上执行,造成了事务的并行,而这个在sql上是不被支持的,你也就是为什么你会得到一个错误“SqlCommand不支持并行事务"。


知道原因,那么修改起来也相当容易了。但这个看起来似乎对你很有用,其实呢,这相当于授人以”鱼“,这只是这个问题的解决方案,我肯定你以后不会再犯,即使如此,授人以”渔“岂不更好?


你打开了错误提示,在错误的配置节中使用了mode="on"的方式,所以你可以看到错误的,一般情况下,很多人看到这个都头大了,把这个错误直接发给”高手“,请求对方帮忙,那么这个错误为什么不自己去看下呢?所以一部分会看到这错误的提示,比如”sqlcommand不允许执行并行事务“,知道了错误的原因,很多初学的人还并不知道是什么情况下发生的错误,当然比如除0溢出一样,他只知道运行时某个分母的值是0,仅此而已。但对于排查来说也是相当困难,某个功能块中并不见得只有一个变量被做为除数的。怎么快速定位到代码呢?

堆栈跟踪起到了很大的作用:他不但有调用关系,还有错误发生的行数,它的格式就是方法(当然是方法的全名,空间名+类名+方法名)空格后跟+号和行数。这个其实是一个例外的冒泡顺序,最顶上一层是最终导致错误发生的位置(方法名称+行数),因为它的发生,所以会冒泡到调用它的方法,直接最后一个方法或try监控的方法体内。如果对类库不是很熟悉情况下,从上到下找到第一个自己写的方法,然后再查看对应的行数,就可以找到发生错误的源码位置了。可能不会理解,为什么有这么多类库中方法报错了呢?其实并不是类库错了,你调用的类库只不过是设置了他们执行方法的一些参数而已。所以是你传入的不合适的参数,并不见得是类库的错误。

比如代码下面的代码

public class Defined.Math
{
    public static int Method1(int num1, int num2)
    {return num1/num2;}
}

//调用方
Defined.Math.Method1(12,0);

显然调用方会发生错误,而例外的冒泡时的第一个方法是Method1的方法中的语句,而不是调用方的语句!

这就是怎么看冒泡的,虽然这种情况下,一般我们可以找到第一个我们写的方法,然后去修改它,但由于开发模式的原因,修改的未必是第一个冒泡的方法中语句。

方法教你了,再浅谈一下为什么会有这种情况,很多半瓶水的会认为修改Method1,如:

public static int Method1(int num1, int num2)
{
    if(num2==0)
      return 0;
    return num1/num2;
}

这种代码看起来能很好的解决兼容问题,其实并非是解决问题之道。为什么呢?原因就是在于.net强大的例外机制!他们从来没有想到过会用这个强大的武器,只会用代码向上堆,有时问题并非那么简单的。如果是网络或者IO之类的错误呢?因为不会用.net的例外机制,所以他们可能没有写过这样的代码:

public void Method(int num)
{
    if(num==0)
       throw new Exception();
    // other code doing something;
}

之所以说.net有一个强大的例外机制作为武器,是因为我们可以创建类继承于Exception实现自定的例外!那些连throw都不会用的,自然从来不会接触到自定的exception的。所以对于同的情况分析时,我们完全可能会自己抛例外,这时怎么修改?你打算把抛出例外的语句改掉吗?


当然我是拿这个例子来说明怎么定位源码中错误的位置,冒泡的第一个位置只是错误发生的位置,并不是修改代码的位置,准确理解这个含义之后,你看堆栈时,可以直接定位到错误,而不是直接定位到你写的第一个抛出例外的方法!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 江苏省南京市2021年高考美术生文化分和专业分比例多少? 2021年河北美术联考230分,文化课需要多少分才能上二本? 如何从根本上解决中小企业融资难 如何有效解决中小企业融资难的问题? 如何解决创业融资问题 东吴证券配股什么时候到账 如何解决私营企业融资难问题 腾讯王卡的免流应用包括虎牙tv吗? 东吴证券配股什么时候上市 喝酒过量危害大,解酒的饮品都有哪些? 2021年东吴证券配股时间 蜂蜜柚子茶里面含葡萄糖浆和白砂糖减肥可以喝吗? 吃gnc葡萄籽可以喝蜂蜜柚子茶吗 常见水果的各种营养成分含量多少? 柠檬柚子茶和葡萄能一起吃吗f 蜂蜜柚子茶和葡萄一起可以喝吗 小票打印机打印出来的字太小,是个网页版的系统 苏泊尔不粘锅涂层有毒吗 过几天去北京旅游,带小孩,谁能给我推荐几个去处? 康巴赫炒锅干烧了一次不会影响质量问题吧? 算法公司角逐AI芯片,商业化之难如何破? 悟空云信息技术有限公司在“AI算法+AR场景”的研究领域有哪些时间案例或成果? 2021年秦汉美术班文化课录取分数线是多少 以人工冒充AI,各大AI公司深陷造假门的背后到底隐藏着什么? 硕士校招offer选择,搞AI算法的,外企和互联网不知怎么选择? 2021届河南考生美术209文化课450左右,能上个好一点的二本吗,如果要上一本,文化需多少分_百度问一问 目前哪些知名的科技公司/互联网大厂开始今年秋招了?哪些公司薪资待遇比较好? 人工智能机器人移动核心算法国内有公司做么 江苏2021年高考美术怎么考 要多少分 深圳艾摩米智能科技有限公司的能力如何? 广东省2021年高考投档线是多少? 甘肃民族师范学院艺术类2019分数线多少2021艺术分和艺术生文化分分别是多少? AI算法属于软件企业吗 乐驾能源AI算法怎么样? 快看点怎么帮好友助力? 360软件管家无法更新和升级软件怎么办,网络明明是好的 360软件管家软件列表没有软件,请检查网路连接,明明我联网了啊 360软件管家中软件大全不能显示软件,其他上网正常 我将电脑桌面上的程序放到了360软件管家里、现在却没有了怎么找到这些软件 word中怎么设置文档每页为36行