通过简单示例描述微软WCF中的事务,以及如何开发带事务的服务。
事务是指具有下列属性的操作集合:
原子性。此属性可确保特定事务下完成的所有更新都已提交并保持持久,或所有这些更新都已中止并回滚到其先前状态。
一致性。此属性可保证某一事务下所做的更改表示从一种一致状态转换到另一种一致状态。例如,将钱从支票帐户转移到存款帐户的事务并不改变整个银行帐户中的钱的总额。
隔离。此属性可防止事务遵循属于其他并发事务的未提交的更改。隔离在确保一种事务不能对另一事务的执行产生意外的影响的同时,还提供一个抽象的并发。
持续性。这意味着一旦提交对托管资源(如数据库记录)的更新,即使出现失败这些更新也会保持持久。
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 : ICalculator5. {6. [OperationBehavior(TransactionScopeRequired = true)]7. public double Add(double n1, double n2)8. {9. // Perform transactional operation10. 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 operation18. 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 brevity25. // This is where the transaction provides specific benefit26. // – changes to the database will be committed only when27. // the transaction completes.28. }29.}
3、配置:
在配置文件中配置绑定,指定事务上下文应进行流处理,并指定要使用的协议执行此操作。
1. <service name=”CalculatorService”>2. <endpoint address=”net.tcp://localhost:8008/CalcService”3. binding=”netTcpBinding”4. bindingConfiguration=”transactionalOleTransactionsTcpBinding”5. contract=”ICalculator”6. name=”OleTransactions_endpoint” />7. </service>
1. <bindings>2. <netTcpBinding>3. <binding name=”transactionalOleTransactionsTcpBinding”4. transactionFlow=”true”5. transactionProtocol=”OleTransactions”/>6. </netTcpBinding>7. </bindings>
(二)、System.Transaction事务
System.Transaction命名空间提供了很多与实务相关的类和接口,System.Transaction命名空间提供了一个基于Transaction类的显式编程模型和一个使用TransactionScope类的隐式编程模型(在此模型中,基础结构自动管理事务)。微软推荐使用隐式事务编程模型(由于它易于使用并且效率很高)。
隐式事务编程示例:
void RootMethod()
{
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
SomeMethod();
SomeOtherMethod();
scope.Complete();
}
}
void SomeMethod()
{ //事务嵌套
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete();
}
}
}
(三)MSDTC事务
Microsoft Distributed Transaction Coordinator(MSDTC)是一个事务管理器,它为分布式事务提供支持。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
任意云 | 合纵连横,微软+戴尔重构混合云的新局面
随着去年各行各业的“互联网+”战略全面启动,“在中国、为中国”的戴尔本着任意云战略,联合微软公有云Azure,优势互补,合纵连横,正在打开混合云市场的新局面。
-
Windows Server 2012云生态迅速崛起
微软Windows Server 2012云创益大赛日前在北京落下帷幕,大赛揭晓了团队赛获奖团队名单。
-
使用标识和访问工具保护ASP.NET应用程序
Microsoft最近发布了用于Visual Studio 2012的标识和访问工具,那么如何使用该标识工具进行ASP.NET应用程序的保护呢?
-
System Center 2012:QMD百万马力背后的私有云推手
对期待降低IT基础架构复杂度和IT成本的企业来说,云计算彻底改变了企业提供和使用 IT 服务的方式,并能带来更高生产力的基础架构,以及更易于预测的应用程序。