当前位置:www.6728.com > www.6728.com >
 

然后鄙人面回滚的处所


 
     时间:2019-11-05    浏览次数:

  关于事务嵌套,以前领会一些,但老是属于含糊其词,日常平凡处置这种问题时候也是按照前人的经验,但至于为什么这么做,还实是“知其然不知其所以然”。(博客园的代码展开为什么不克不及展开呢?还请列位大侠指导!)

  能够看的出,这个错误是正在内部事务回滚带出名称的事务的时候,发觉没有该名称的事务或保留点,由于会激发这个非常,为什么会如许呢?大师看一下微软的注释:

  这个存储过程包含了一个事务,并且正在事务的内部又挪用了Sp_UserMoneyLess,而Sp_UserMoneyLess这个存储过程内部又包含了一个事务,这就呈现了事务嵌套的场景,这也恰是本文要会商的内容。

  现正在我们来测试一下我们的Sp_UserMoneyLess,正在测试之前,我们插入一些测试数据:

  大师能够看到我们正在本来事务起始的处所,添加了一个事务保留点SAVE TRAN UserMoneyLess,然后鄙人面回滚的处所,加上了保留点名称。

  也就是说,最终的事务能否提交,决定权正在外部的事务,即便内部事务进行了提交,只需外部事务按照内部前往的值来决定提交或者回滚,就能够把外部和所有嵌套的事务都提交或者回滚。

  为了愈加切近现实,本文的例子尽量接近实正在营业,正在此我们拿一个电子商务网坐的订单领取来进行举例,具编制子如下

  我们操纵一个现实营业场景来了事务嵌套的一些问题和一些处置方式,但由于小我学问无限,如本文中有理解不到位的处所,还请列位大侠们不惜赐教。

  该方式操纵正在内部嵌套中添加一个事务保留点(Save Tran savepoint_name),然后正在内部嵌套中需要进行回滚的处所施行Rollback Tran savepoint_name如许,就能够把事务回滚到savepoint_name这个保留点,好了,领会了道理,我们点窜代码如下:

  两种方决了事务嵌套的问题。当然用上述的两种方式所建立的嵌套存储过程若是想要零丁利用,必需正在外层嵌套一层事务或者正在营业层挪用这种存储的时候,加上事务,各个ORM中都有事务的功能,若是你还正在用DbHelper,也能够本人封拆一个事务处置类,正在营业逻辑层进行事务处置。

  第一种:操纵Commit Tran的道理,内部事务任何时候进行Commit tran,不管数据非常取否,若是呈现异据,前往异据提醒就能够。

  本来内部的事务中若是施行了没有事务名称的回滚,会将所有的嵌套事务,包罗最外层的事务都回滚。那怎样办呢?莫非我们不克不及利用嵌套事务?你能够能会说:不成能啊,该当是能够的啊!呵呵,是的,我们当然能够利用嵌套事务。处理这个问题有两种方式:

  嵌套事务一般的利用场景是一些公用的,最小单位的营业逻辑,这些营业逻辑良多环境下都是被别的一些愈加复杂,愈加完整的营业逻辑挪用。

  由于扣除账户余额是一个公用的,最小单位的营业逻辑,所以我们特地成立一个存储过程来施行该过程。代码如下:

  哦!本来Sql Server不答应我们正在内部的事务中包含事务名称。那好,我们现正在就把这个事务名称去掉,代码点窜如下:

  本文的目标是跟大师会商一下关于嵌套事务的相关问题,所以相关事务的根本学问和概念,本文假设读者曾经领会。真钱捕鱼游戏平台

  SQL Server 数据库引擎将忽略内部事务的提交。按照最外部事务竣事时采纳的操做,将提交或者回滚内部事务。若是提交外部事务,也将提交内部嵌套事务。若是回滚外部事务,也将回滚所有内部事务,不管能否零丁提交过内部事务。

  今天一个同事问我关于事务的问题,我就用代码给他举例测试,正在测试的过程中我碰到了一点小问题,但正在继续测试的时候,我处理了这个问题,也让我对事务的嵌套有了愈加深刻的认识。

  为什么又呈现了这个错误呢?从这个错误我们能够阐发犯错误的缘由是正在外部的事务中回滚事务的时候没有找到对应的Begin Tran,可我们的代码中明明有 Begin Tran PayOrder啊,为什么还会呈现这个错误呢?正在此我找到了微软的注释:



友情链接:

Copyright 2019-2022 http://www.yuanhuisp.cn 版权所有 未经协议授权禁止转载