zoukankan      html  css  js  c++  java
  • WCF Transaction

    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)
              {
              }
          }

  • 相关阅读:
    多态的详解
    Java继承详解
    static关键字特点
    数组(相关知识的整理)
    杨辉三角(用for循环)
    Jmeter接口测试案例实践(一)
    组合测试方法:配对测试实践
    用例设计方法:判定表驱动法实践
    sso系统登录以及jsonp原理
    单点登录--sso系统
  • 原文地址:https://www.cnblogs.com/webglcn/p/2480450.html
Copyright © 2011-2022 走看看