TransactionFlowOption有三個選項:
一為NotAllowed,這代表了禁止客戶端傳播事務流到服務端,即使客戶端啟動了事務,該事務也會被忽略;
二為Allowed,這代表允許客戶端的事務傳播到服務端,但服務器端不一定會引用到此事務;
三為Mandatory,這代表服務端與客戶端必須同時啟動事務流,否則就會拋出InvalidOperationException異常。
wcf服務可以關閉嗎,?
?
[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)
????????? {
????????? }
????? }