TransactionFlowOption有三个选项:

  一为NotAllowed,这代表了禁止客户端传播事务流到服务端,即使客户端启动了事务,该事务也会被忽略;

  二为Allowed,这代表允许客户端的事务传播到服务端,但服务器端不一定会引用到此事务;

  三为Mandatory,这代表服务端与客户端必须同时启动事务流,否则就会抛出InvalidOperationException异常。

[ServiceContract(SessionMode=SessionMode.Required)]
  public interface IOrdersService
  {
    [OperationContract]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    string PlaceOrder(Order order);
  }

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, TransactionAutoCompleteOnSessionClose=true)]
  public class OrdersService : IOrdersService
    [OperationBehavior(TransactionScopeRequired=true,
      TransactionAutoComplete=false)]
    public string PlaceOrder(Order order)
    {
      using (var conn = new SqlConnection(connString))
      {
        var cmd = new SqlCommand("Insert Orders (CustomerId) Values( @customerId)", conn);
        cmd.Parameters.Add(new SqlParameter("@customerId", order.CustomerId));

try
        {
          conn.Open();
          if (cmd.ExecuteNonQuery() <= 0)
          {
            return "The order was not placed";
          }

cmd = new SqlCommand("Select Max(OrderId) From Orders Where CustomerId = @customerId", conn);
          cmd.Parameters.Add(new SqlParameter("@customerId", order.CustomerId));

using (SqlDataReader reader = cmd.ExecuteReader())
          {
            while (reader.Read())
            {
              orderId = Convert.ToInt32(reader[0].ToString());
            }
          }
          return string.Format("Order {0} was placed", orderId);
        }
        catch (Exception ex)
        {
          throw new FaultException(ex.Message);
        }
      }
    }

[OperationBehavior(TransactionScopeRequired = true,
      TransactionAutoComplete = false)]
    public string AdjustInventory(int productId, int quantity)
    {
      using (var conn = new SqlConnection(connString))
      {
        var cmd = new SqlCommand("Update Products Set OnHand = 1 Where ProductId = @productId", conn);
        cmd.Parameters.Add(new SqlParameter("@quantity", quantity));

try
        {
          conn.Open();
          if (cmd.ExecuteNonQuery() <= 0)
          {
            return "The inventory was not updated";
          }
          else
          {
            return "The inventory was updated";
          }
        }
        catch (Exception ex)
        {
          throw new FaultException(ex.Message);
        }
      }
    }

----------------------client---------------------------
      using (var tranScope = new TransactionScope())
      {
        proxy = new OrdersServiceClient("WSHttpBinding_IOrdersService");
        {
          try
          {
            result = proxy.PlaceOrder(order);

tranScope.Commit();
          }
          catch (FaultException faultEx)
          {
          }
      }

转载于:https://www.cnblogs.com/webglcn/archive/2012/05/03/2480450.html

WCF Transaction相关推荐

  1. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  2. 化零为整WCF(14) - 事务(Transaction)

    [索引页] [源码下载] 化零为整WCF(14) - 事务(Transaction) 作者:webabcd 介绍 WCF(Windows Communication Foundation) - 事务( ...

  3. 4.WCF事务【Transaction】

    契约: namespace Rhythmk.Contracts { [ServiceContract(Namespace="http://wwww.wangkun.com")] p ...

  4. WCF中的序列化[上篇]

    SOA 和Message Windows Communication Foundation (WCF) 是基于面向服务架构(Service Orientation Architecture--SOA) ...

  5. WCF服务端运行时架构体系详解[下篇]

    作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指 ...

  6. WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用

    在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务 ...

  7. WCF版的PetShop之一:PetShop简介[提供源代码下载]

    在<WCF技术剖析(卷1)>的最后一章,我写了一个简单基于WCF的Web应用程序,该程序模拟一个最简单的网上订购的场景,所以我将其命名为PetShop.PetShop的目在于让读者体会到在 ...

  8. 我的WCF之旅(12):使用MSMQ进行Reliable Messaging(转载)

    一.为什么要使用MSMQ 在一个分布式的环境中,我们往往需要根据具体的 情况采用不同的方式进行数据的传输.比如在一个Intranet内,我们一般通过TCP进行高效的数据通信:而在一个Internet的 ...

  9. 《WCF技术剖析(卷2)》目录

    第1章 异常处理 (Exception Handling) 1.1.    WCF基本异常处理模式 1.1.1.     当异常从服务端抛出(S101) 1.1.2.     异常细节的传播(S102 ...

最新文章

  1. 设计模式之代理模式(Proxy)摘录
  2. CTS ( 19)---Android 8.1/GO GMS认证
  3. loadrunner11基础使用
  4. DOTNET零碎要点---1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库
  5. vv7无法启动显示发动机故障_发动机电控系统常见故障(发动机不能启动)的解决方法...
  6. 作业五之系统设计时所实现的质量属性战术
  7. 二分法04:猜数字大小
  8. mysql存储过程的学习(mysql提高执行效率之进阶过程)
  9. POJ1159 Palindrome(dp)
  10. thymeleaf参考手册
  11. auto dvr_什么是“广播DVR服务器”,为什么在我的PC上运行它?
  12. 淘宝客返利机器人源码编写教程.
  13. P1957 口算练习题
  14. 《风车》——仓央嘉措
  15. 【MySQL基础篇】数据导出导入权限与local_infile参数
  16. SpringBoot+Vue实现前后端分离的宠物医院管理系统
  17. TCP连接的建立和释放过程详解(三次握手、四次挥手)
  18. 红旗桌面4.0正式版最新使用方法和问题解答100例
  19. 超级电容锂电池混合储能Simulink仿真
  20. HJY-F931A/YJ三相电压继电器

热门文章

  1. ios弧形进度条_iOS手把手教你实现圆形进度条
  2. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密
  3. 移动硬盘无法休眠了?
  4. Excel文档VBA代码自动删除
  5. 在VB6中保存单色(1Bit)位图(VB6代码)
  6. 粤港澳大湾区落地首家技术VC,创新工场25亿加持,做投资也做AI研发
  7. 他们在大学本科实现童年梦想!自研火箭,飞向外太空,创造人类新纪录
  8. 谷歌云TPU上可以用Julia啦!0.23秒跑100张图片,Jeff Dean点赞推荐
  9. AI给你安利了一个职位,猜猜它觉得你适合做什么?
  10. 苹果无人车四个最新专利:手势控制变道、车辆导流、路况感知及车辆控制