在.NET2.0中使用自定义事务操作
副标题[/!--empirenews.page--]
.net 2.0 framework 中新增了 System.Transactions 命名空间,其中提供的一系列接口和类使得在.net 2.0 中使用事务比起从前要方便了许多。有关在 .net 2.0 下操作数据库事务的文章已经有了很多,这里只提一下如何设计自定义事务操作。 一、事务使用基础 先看一段使用事务的代码: 1using (TransactionScope ts= new TransactionScope()) 这里使用 using 语句定义了一段隐性事务。如果我们在该语句块中加入一段对 SQL Server 操作的代码,那么它们将会自动加入这个事务。可以看出,这种事务的使用方式是极其方便的。 那么,有没有可能在该语句块中加入我们自己定义的事务操作,并且该操作能够随着整个事务块的成功而提交,随其失败而回滚呢?答案当然是可以的,否则我就不会写这篇随笔了。 二、实现自定义事务操作 根据事务的特性,我们可以推想:这个操作必须有实现提交和回滚之类动作的方法。没错,这就是 System.Transactions 命名空间中的 IEnlistmentNotification 接口。我们先写一个最简单的实现: 1class SampleEnlistment1 : IEnlistmentNotification 好,定义完之后,还需要向事务管理器进行注册,把它加入到当前事务中去: 1using (TransactionScope ts= new TransactionScope()) 执行这一段代码,我们可以得到以下的输出: 准备! 提交! 先解释一下,当调用 ts.Complete() 方法的时候,表示事务已成功执行。随后,事务管理器就会寻找当前所有已注册的条目,也就是 IEnlistmentNotification 的每一个实现,依次调用它们的 Prepare 方法,即通知每个条目做好提交准备,当所有条目都调用了 Prepared() 表示自己已经准备妥当之后,再依次调用它们的 Commit 方法进行提交。如果其中有一个没有调用 Prepared 而是调用了 ForceRollback 的话,整个事务都将回滚,此时事务管理器再调用每个条目的 Rollback 方法。 而如果我们将前面的 ts.Complete() 行注释掉,显然执行结果就将变为: 回滚! 三、一个实现赋值的自定义操作 考虑一下,我们要实现一个事务赋值操作。该如何做法?以下是一个例子: 1class SampleEnlistment2 : IEnlistmentNotification 然后,这样来使用: 1AssignTransactionDemo atd = new AssignTransactionDemo(); 运行这一段代码,我们可以看到如下结果: 事务完成! 退出区域之前,i的值为:0 提交!i的值变为:1 退出区域之后,i的值为:1 从输出结果来看,赋值操作被成功执行了。可是有没有感觉有些奇怪?先做个讨论: 1、如果前面没有 Thread.Sleep(1000) 这一行,那么我们多半会看到最后一行的输出中,i 的值依然会是 0!为什么?想想就容易明白,这里对 Commit 方法是采用的异步调用,如同另开了一个线程。如果主线程不作等待的话,当输出的时候事务的 Commit 方法多半还没有被执行,输出的结果当然就会不对。 2、这个例子中,赋值操作是在 Commit 方法中才实际执行的。但实际上就本例而言,我们也可以做个调整:将赋值操作放在 AssignIntVarValue 方法的最后去执行,然后把 Commit 方法中的赋值操作去掉。相关的代码变化如下: (编辑:通辽站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 异步 HttpContext.Current实现取值的方法(解决异步Applicat
- 陈晓龙:圣象研发,科技驱动—圣象研发中心新实验工厂开工
- asp.net 多数据库支持的思考
- iphone x参数介绍 iphone x与iphone 8 iphone 8plus参数对比
- 九大定制家居品牌齐聚首 新国货之“全球定制之都”高峰论坛
- “双11”电商行业报告:我国新增直播相关企业为2019年增量的
- iPhone X什么时候上市 iPhone X什么时候可以买
- 眼见为实,三大创新助力深圳国际家具展,开启中国家具“内循
- iPhone 8壁纸还是iPhone X壁纸反正都是新iPhone壁纸
- 不造产品,只造作品 | MK因厨间品质生活而彰