WebService事务处理

简介:
如果在WEB服务中有这样一个场景,某个WEB服务的方法要执行两个任务,它首先要在数据库中创建一个新表,接着调用对象来收集和格式化数据,并在新表中插入数据。象这样的一组方法,我们必须保证他们都成功执行,否则会造成很多脏数据在系统中,这时事务就出场了。
关于事务的基本概念再次就不过多涉及,只需要记住它的四个属性ACID即可。
WEB服务中的事务是用WebMethod特性的TransactionOption属性来申明的。如果WEB服务方法执行时发生异常,则自动会终止事务,反之则提交事务。WEB服务的方法仅有两种可能的行为:Disabled,NotSupported,Supported表示不参与事务;Required,RequiresNew表示创建一个新的事务。意思是说当TransactionOption的属性为Required或RequiresNew的WEB服务方法调用另一个TransactionOption的属性为Required或RequiresNew的WEB服务方法时,每个WEB服务方法将参与他们自己的事务。
PS:WEB服务方法的TransactionOption默认属性为Disabled
同时我们也可以显示调用System.EnterpriseServices.ContextUtil类的SetAbort方法取消事务,调用SetCompleted方法完成事务。
例子:
using System.EnterpriseServices;
Class WebServiceTransaction:WebService
{
   pulic void Write(string user,string msg)
   {
     //将接收这两个参数写入数据库。。。
   }
   [WebMethod(TransactionOption=TransactionOption.RequiresNew)]
   public void WiteToDataBasev1(string user,string msg)
   {
      Write(user,msg);
      if(user!="kim")
      {
       string msg="sorry,you can not access";
        throw new UnauthorizedAccessException(msg);
      }
   }

   [WebMethod(TransactionOption=TransactionOption.RequiresNew)]
   public void WiteToDataBaseV2(string user,string msg)
   {
      Write(user,msg);
      if(user!="kim")
      {
       ContextUtil.SetAbort();
      }
       else
      {
         ContextUtil.SetComplete();
      }
   }
}
测试和预期完全正确。



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2011/05/25/2056864.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
XML Java 数据格式
分布式(基础)-WebService(四)
分布式(基础)-WebService(四)
|
3月前
|
XML JSON Java
分布式(基础)-WebService(五)
分布式(基础)-WebService(五)
|
3月前
|
XML Java 数据格式
分布式(基础)-WebService(二)
分布式(基础)-WebService(二)
|
3月前
|
XML Java Apache
分布式(基础)-WebService(三)
分布式(基础)-WebService(三)
|
3月前
|
XML JSON 网络协议
分布式(基础)-WebService(一)
分布式(基础)-WebService(一)
|
5月前
|
消息中间件 中间件 数据库
中间件事务处理
【7月更文挑战第15天】
43 4
|
7月前
|
XML 网络协议 网络架构
WebService - 基础详解
WebService - 基础详解
386 0
tp框架事务处理实例和理解
tp框架事务处理实例和理解
173 0
|
SQL 缓存 关系型数据库
深入理解Yii2 数据库事务
  事务(Transaction)   在Yii中,使用 yii\db\Transaction 来表示数据库事务。   一般情况下,我们从数据库连接启用事务,通常采用如下的形式:   $transaction=$connection->beginTransaction();   try {   $connection->createCommand($sql1)->execute();
431 0