事务是指具有下列属性的操作集合:
- 原子性。此属性可确保特定事务下完成的所有更新都已提交并保持持久,或所有这些更新都已中止并回滚到其先前状态。
- 一致性。此属性可保证某一事务下所做的更改表示从一种一致状态转换到另一种一致状态。例如,将钱从支票帐户转移到存款帐户的事务并不改变整个银行帐户中的钱的总额。
- 隔离。此属性可防止事务遵循属于其他并发事务的未提交的更改。隔离在确保一种事务不能对另一事务的执行产生意外的影响的同时,还提供一个抽象的并发。
- 持续性。这意味着一旦提交对托管资源(如数据库记录)的更新,即使出现失败这些更新也会保持持久。
WCF支持两种事务, WS—AtomicTransction(WS-AT)和OLE事务协议。WS—AT用于将事务流动到可以互操作的第三方WS服务。
WCF提供了事务流的概念。
WCF的事务模型包括:WCF事务、System.Transaction事务、MSDTC事务三种模型。
(一)、Windows Communication Foundation(WCF)事务:
WCF事务是一种声明式事务,而且借助于它对 WS-AtomicTransaction (WS-AT) 协议的支持,应用程序可以将事务流式传输到使用 WCF 或第三方技术生成的 Web 服务。
WCF 事务功能提供了一些属性和配置,用于以声明方式指定基础结构应当创建、流式传输和同步事务的方式和时间。
利用ServiceModel可以对事物进行如下配置:
- 使用 ServiceBehaviorAttribute 属性配置事务超时值以及隔离级别的筛选。
- 启用事务功能并使用 OperationBehaviorAttribute 属性配置事务完成行为。
- 使用协定方法上的 ServiceContractAttribute 和 OperationContractAttribute 属性来要求、允许或拒绝事务流。
利用System.ServiceModel 开发带事务的服务,步骤如下:
1、接口定义:定义接口的时候使用 annotation对方法进行标识即可,如:
1. [ServiceContract] 2. public interface ICalculator 3. { 4. [OperationContract] 5. // Use this to require an incoming transaction 6. [TransactionFlow(TransactionFlowOption.Mandatory)] 7. double Add(double n1, double n2);
8. [OperationContract] 9. // Use this to permit an incoming transaction 10. [TransactionFlow(TransactionFlowOption.Allowed)] 11. double Subtract(double n1, double n2); } |
2、实现:在实现类中使用 ServiceBehaviorAttribute 有选择地指定 TransactionIsolationLevel 和 TransactionTimeout
如:
1. [ServiceBehavior( 2. TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable, 3. TransactionTimeout = "00:00:45")] 4. public class CalculatorService : ICalculator 5. { 6. [OperationBehavior(TransactionScopeRequired = true)] 7. public double Add(double n1, double n2) 8. { 9. // Perform transactional operation 10. RecordToLog(String.Format("Adding {0} to {1}", n1, n2)); 11. return n1 + n2; 12. } 13. 14. [OperationBehavior(TransactionScopeRequired = true)] 15. public double Subtract(double n1, double n2) 16. { 17. // Perform transactional operation 18. RecordToLog(String.Format("Subtracting {0} from {1}", n2, n1)); 19. return n1 - n2; 20. } 21. 22. private static void RecordToLog(string recordText) 23. { 24. // Database operations omitted for brevity 25. // This is where the transaction provides specific benefit 26. // - changes to the database will be committed only when 27. // the transaction completes. 28. } 29.} |
3、配置:
在配置文件中配置绑定,指定事务上下文应进行流处理,并指定要使用的协议执行此操作。
1. 2. 3. binding="netTcpBinding" 4. bindingConfiguration="transactionalOleTransactionsTcpBinding" 5. contract="ICalculator" 6. name="OleTransactions_endpoint" /> 7. |
1. 2. 3. 4. transactionFlow="true" 5. transactionProtocol="OleTransactions"/> 6. 7. |
(二)、System.Transaction事务
System.Transaction命名空间提供了很多与实务相关的类和接口,System.Transaction命名空间提供了一个基于 Transaction 类的显式编程模型和一个使用 TransactionScope 类的隐式编程模型(在此模型中,基础结构自动管理事务)。微软推荐使用隐式事务编程模型(由于它易于使用并且效率很高)。
隐式事务编程示例:
void RootMethod() SomeOtherMethod(); void SomeMethod()
} |
(三)MSDTC 事务
Microsoft Distributed Transaction Coordinator (MSDTC) 是一个事务管理器,它为分布式事务提供支持。