现在的位置: 首页 > 综合 > 正文

WCF 示例学习笔记007之服务事务行为(01.02.01.06)

2012年03月16日 ⁄ 综合 ⁄ 共 7908字 ⁄ 字号 评论关闭

此示例演示客户端协调事务的用法,以及为了控制服务事务行为而对 ServiceBehaviorAttribute 和 OperationBehaviorAttribute 进行的设置。持久写入服务器日志表依赖于客户端协调事务的结果 - 如果客户端事务未完成,Web 服务事务可以确保不会提交对数据库的更新。

下面我们把程序的代码依次列出来。
契约和服务类的代码:

Code

 

服务端的配置文件:

Code

 

客户端的代码:

Code

 

正常情况下,我们运行客户端,会发现数据表中添加了ID从1到4的4条记录。

1. 注释掉tx.Complete(),我们重新编译客户端并运行,会发现服务端和客户端的控制台正常显示,但数据库中并未添加数据。
这时,我们取消对tx.Complete()的注释,重新编译运行后,会发现Log表中新纪录数据的开始的ID为9。缺少的ID为5~8的4条数据即为客户端在未完成其事务的情况下退出事务范围所造成的数据回滚。

2. 在客户端注释掉对Divide()方法的调用,重新编译客户端并运行,程序运行到using (TransactionScope tx = new TransactionScope())的结束符出现异常“已中止事务”。这时,我们取消对Divide()方法的注释,重新编译运行后,查看数据表,我们会发现新数据开始的ID为16。缺少了ID为13~15这3条数据,这是由于Multiply操作启动的事务无法完成,从而使客户端事务最终也无法完成,造成数据回滚。

3. 我们在调用减法后添加一个抛出异常的语句:throw new Exception();编译并运行客户端,程序运行完减法后即抛出异常。这时,将这条抛出异常的语句注释掉,重新编译运行客户端程序,我们会看到数据表中添加的新数据的ID是从22开始的。缺少的ID为20、21,这是由于异常阻止了客户端完成其事务所造成的数据回滚。

下面我把通过以上操作数据表上添加的记录贴出来,

下载程序示例

抱歉!评论已关闭.