WCF - Giao dịch
Một giao dịch trong WCF là một tập hợp các hoạt động tuân theo một số thuộc tính, được gọi chung là ACID. Ở đây, nếu một thao tác không thành công, toàn bộ hệ thống sẽ tự động bị lỗi. Khi một đơn đặt hàng được đặt trực tuyến, một giao dịch sẽ diễn ra. Ví dụ sau có thể hữu ích để hiểu quy trình giao dịch theo các thuật ngữ đơn giản hơn.
Thí dụ
Giả sử bạn đã đặt mua một chiếc tivi LCD từ một cửa hàng trực tuyến và bạn sẽ thanh toán số tiền bằng thẻ tín dụng của mình. Khi bạn nhập thông tin cần thiết để đặt hàng, hai thao tác xảy ra đồng thời.
Một, số tiền cụ thể được ghi nợ từ tài khoản ngân hàng của bạn và thứ hai, tài khoản nhà cung cấp được ghi có với số tiền tương tự. Cả hai hoạt động phải thực hiện thành công để có một giao dịch thành công.
Thuộc tính giao dịch WCF
Bốn thuộc tính được theo sau bởi một giao dịch WCF là:
Atomic - Tất cả các hoạt động phải hoạt động như một hoạt động không thể phân chia duy nhất khi hoàn thành giao dịch.
Consistency - Dù có thể là bộ hoạt động nào, hệ thống luôn ở trạng thái nhất quán, tức là, kết quả của giao dịch luôn như mong đợi.
Isolation - Trạng thái trung gian của hệ thống không được hiển thị cho bất kỳ thực thể nào của thế giới bên ngoài cho đến khi giao dịch hoàn tất.
Durability - Trạng thái cam kết được duy trì bất kể loại lỗi nào (phần cứng, mất điện, v.v.)
Trong khi định cấu hình một giao dịch WCF, có một số yếu tố cần được xem xét. Đây là những ràng buộc và hành vi hoạt động.
Binding- Các ràng buộc hỗ trợ giao dịch trong WCF chỉ có một số ít và điều quan trọng là chỉ đưa ra lựa chọn từ những ràng buộc này, những ràng buộc này vẫn bị vô hiệu hóa theo mặc định và nên được kích hoạt để nhận được sự hỗ trợ cần thiết cho giao dịch. Những ràng buộc này như sau:
- NetTcpBinding
- NetNamedPipeBinding
- WSHttpBinding
- WSDualHttpBinding
- WSFederationHttpBinding
Operation behavior- Trong khi một ràng buộc tạo điều kiện thuận lợi cho con đường truyền giao dịch, một hoạt động sẽ xử lý giao dịch cũng như cấu hình hoạt động. Hành vi hoạt động chủ yếu sử dụng hai thuộc tính: TransactionFlow và TransactionScopeRequired. Ở đây, cần lưu ý rằng TransactionFlow chủ yếu có ba giá trị và đó là: Được phép, Bắt buộc và Không được phép.
Đoạn mã sau đây cho biết việc thay đổi cấu hình của hợp đồng ràng buộc và hoạt động có tạo điều kiện cho việc truyền tải ứng dụng khách hay không.
<bindings>
<wsHttpBinding>
<binding name = "MandatoryTransBinding" transactionFlow = "true">
<reliableSession enabled ="true"/>
</binding>
</wsHttpBinding>
</bindings>
Giao thức giao dịch
WCF sử dụng ba loại giao thức để giao dịch -
- Lightweight
- Giao dịch Ole
- WS-Giao dịch nguyên tử (WS-AT)
Trong cả ba, WS-AT là một giao thức có thể tương tác và cho phép luồng giao dịch phân tán qua các bức tường lửa. Tuy nhiên, giao thức này không nên được sử dụng khi giao dịch hoàn toàn dựa trên công nghệ của Microsoft.
Các giai đoạn của giao dịch WCF
Có hai giai đoạn trong một giao dịch WCF như thể hiện trong hình sau.
Prepare Phase - Trong giai đoạn này, người quản lý giao dịch kiểm tra xem tất cả các thực thể đã sẵn sàng cam kết cho giao dịch hay chưa.
Commit Phase - Trong giai đoạn này, cam kết của các thực thể bắt đầu đi vào thực tế.
Hình sau minh họa các chức năng của cả hai giai đoạn của một giao dịch WCF.
Kích hoạt giao dịch WCF
Để kích hoạt một giao dịch WCF thành công, người ta cần làm theo một chuỗi sáu bước theo cách tuần tự. Các bước cần thiết được thảo luận dưới đây.
Step 1 − Creation of two WCF Services
Bước quan trọng nhất trong vấn đề này là xây dựng hai dự án dịch vụ trong WCF để tham gia vào một giao dịch duy nhất. Các giao dịch cơ sở dữ liệu sẽ được thực hiện trên cả hai dịch vụ này và sẽ được hiểu rằng cách chúng được thống nhất bởi một giao dịch WCF. Một ứng dụng web WCFTransactions cũng đã được tạo để sử dụng hai dịch vụ đã tạo trong một phạm vi giao dịch duy nhất.
Step 2 − Method creation and its attribution with TransactionFlow attribute
Tại đây, một phương thức UpdateData sẽ được tạo cho cả hai dịch vụ WCF để chèn vào cơ sở dữ liệu với thuộc tính OperationContract. Để thực hiện nhiệm vụ này, trước tiên một lớp giao diện được tạo với sự trợ giúp của thuộc tính ServiceContract. Đối với việc kích hoạt giao dịch trong phương thức mới được tạo, nó được gán với TransactionFlow và các giao dịch được phép sử dụng là Giá trị được phép.
[ServiceContract]
public interface IService1 {
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
Step 3− Implementation of WCF service with TransactionScopeRequired attribute
Nó được thực hiện bằng cách sử dụng mã hiển thị bên dưới -
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
try {
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
Boolean doRollback = false;
using(SqlCommand cmd = new SqlCommand(
"insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
try {
cmd.ExecuteNonQuery();
} catch(SqlException) {
doRollback = true;
break;
}
}
if(doRollback)
transaction.Rollback();
else
transaction.Commit();
}
finally {
objConection.Close();
}
}
Step 4 − Enabling Transaction Flow by WCF Service Config File
Mã hóa của nó được thực hiện như sau:
<bindings>
<wsHttpBinding>
<binding name = "TransactionalBind" transactionFlow = "true"/>
</wsHttpBinding>
</bindings>
Điều quan trọng là phải gắn ràng buộc giao dịch được phép với điểm cuối để hiển thị dịch vụ WCF.
<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">
Step 5 − Calling both the services in a single transaction
Ở đây, hai dịch vụ trên được gọi trong một giao dịch và cho mục đích này, đối tượng TransactionScope được sử dụng để nhóm cả hai dịch vụ. Phương thức Complete của đối tượng trên được gọi để cam kết một giao dịch WCF. Để khôi phục, phương thức Dispose sẽ được gọi.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
// Call your webservice transactions here
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
Đoạn mã nhỏ hoàn chỉnh trong đó các giao dịch WCF đã được nhóm lại trong một phạm vi được mô tả bên dưới:
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
Step 6 − Testing WCF transaction
Thử nghiệm được thực hiện ở bước thứ 6 và bước cuối cùng và sau khi gọi dịch vụ WCF đầu tiên, một ngoại lệ sẽ bị bắt buộc.