WCF程序事务相关定义与实现方法详解
创始人
2024-06-23 20:51:42
0

WCF开发工具为我们带来了非常大的好处。它的强大的功能优势令其在开发领域中占据着非常重要的地位。在这里我们将会为大家详细介绍一下有关WCF程序事务的相关定义与实现方法,希望能对大家有所帮助。

WCF程序事务定义如下:

 

  1. [ServiceContract(SessionModeSessionMode = SessionMode.Required)]  
  2. public interface IComplexService  
  3. {  
  4. [OperationContract]  
  5. [TransactionFlow(TransactionFlowOption.Mandatory)]  
  6. void ExecuteNoneQuery1(string sql);  
  7. [OperationContract]  
  8. [TransactionFlow(TransactionFlowOption.Mandatory)]  
  9. void ExecuteNoneQuery2(string sql);  
  10. [OperationContract]  
  11. [TransactionFlow(TransactionFlowOption.Mandatory)]  
  12. void ExecuteNoneQuery3(string sql);  

 

WCF程序事务实现如下:

 

  1. [ServiceBehavior(TransactionTimeout = "00:00:45",
    TransactionIsolationLevel = System.Transactions.IsolationLevel.
    Serializable)]  
  2. public class ComplexServiceImplement : IComplexService  
  3. {  
  4. private static void ExecuteNoneQuery(string sql)  
  5. {  
  6. string sqlConnectionString = "Password=sa;User 
    ID=sa;Initial Catalog=ipedf;Data Source=.";  
  7. string oraConnectionString = "User ID=sample;
    Password=sample;Data Source=insapp";  
  8. using (OracleConnection oraConnection = new OracleConnection
    (oraConnectionString))  
  9. {  
  10. try  
  11. {  
  12. oraConnection.Open();  
  13. OracleCommand cmd = oraConnection.CreateCommand();  
  14. cmd.CommandText = sql;  
  15. cmd.CommandType = CommandType.Text;  
  16. cmd.ExecuteNonQuery();  
  17. }  
  18. catch (Exception e)  
  19. {  
  20. string Debug = e.Message;  
  21. }  
  22. finally  
  23. {  
  24. oraConnection.Close();  
  25. }  
  26. }  
  27. using (SqlConnection sqlConnection = 
    new SqlConnection(sqlConnectionString))  
  28. {  
  29. try  
  30. {  
  31. sqlConnection.Open();  
  32. SqlCommand cmd = sqlConnection.CreateCommand();  
  33. cmd.CommandText = sql;  
  34. cmd.CommandType = CommandType.Text;  
  35. cmd.ExecuteNonQuery();  
  36. }  
  37. catch (Exception e)  
  38. {  
  39. string Debug = e.Message;  
  40. }  
  41. finally  
  42. {  
  43. sqlConnection.Close();  
  44. }  
  45. }  
  46. }  
  47. [OperationBehavior(  
  48. TransactionScopeRequired = true, TransactionAutoComplete = true)]  
  49. public void ExecuteNoneQuery1(string sql)  
  50. {  
  51. ExecuteNoneQuery(sql);  
  52. //OperationContext.Current.SetTransactionComplete();  
  53. }  
  54. [OperationBehavior(  
  55. TransactionScopeRequired = true, TransactionAutoComplete = true)]  
  56. public void ExecuteNoneQuery2(string sql)  
  57. {  
  58. ExecuteNoneQuery(sql);  
  59. //OperationContext.Current.SetTransactionComplete();  
  60. }  
  61. [OperationBehavior(  
  62. TransactionScopeRequired = true, TransactionAutoComplete = true)]  
  63. public void ExecuteNoneQuery3(string sql)  
  64. {  
  65. ExecuteNoneQuery(sql);  
  66. //OperationContext.Current.SetTransactionComplete();  

 

服务端配置如下:

 

  1. < system.serviceModel> 
  2. < !--提供的服务--> 
  3. < services> 
  4. < service name="Wf.Complex.Service.ComplexServiceImplement" 
    behaviorConfiguration="myServiceBehavior"> 
  5. < endpoint address="" binding="wsHttpBinding" bindingConfiguration=
    "transactionalWsatHttpBinding" contract=
    "Wf.Complex.Service.IComplexService"/> 
  6. < endpoint address="mex" binding="mexHttpBinding" 
    contract="IMetadataExchange"/> 
  7. < /service> 
  8. < /services> 
  9. < behaviors> 
  10. < serviceBehaviors> 
  11. < behavior name="myServiceBehavior"> 
  12. < serviceMetadata httpGetEnabled="True"/> 
  13. < serviceDebug includeExceptionDetailInFaults="False"/> 
  14. < /behavior> 
  15. < /serviceBehaviors> 
  16. < /behaviors> 
  17. < bindings> 
  18. < wsHttpBinding> 
  19. < binding name="transactionalWsatHttpBinding" transactionFlow="true"/> 
  20. < /wsHttpBinding> 
  21. < /bindings> 
  22. < /system.serviceModel> 

 

客户端代码如下:

 

  1. IComplexService complex = new ComplexServiceClient();  
  2. try  
  3. {  
  4. using (TransactionScope scope = new TransactionScope
    (TransactionScopeOption.Required))  
  5. {  
  6. string sql = "delete from student";  
  7. complex.ExecuteNoneQuery1(sql);  
  8. sql = "insert into student(id,name) values(1,'yeyang_1')";  
  9. complex.ExecuteNoneQuery2(sql);  
  10. sql = "insert into student(id,name) values(2,'yeyang_2')";  
  11. complex.ExecuteNoneQuery3(sql);  
  12. scope.Complete();  
  13. }  
  14. Console.WriteLine("succeed");  
  15. }  
  16. catch (Exception expt)  
  17. {  
  18. Console.WriteLine(expt.Message);  
  19. }  
  20. finally  
  21. {  
  22. (complex as ComplexServiceClient).Close();  

 

运行结果:#t#

服务端的ExecuteNoneQuery方法中using (OracleConnection oraConnection = new OracleConnection(oraConnectionString))代码块发生异常,异常内容如下:

"无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。"

结论:

对于数据库事务,可以通过WCF程序事务变形的方式来实现,但必须获取对应数据库产品的支持,sqlserver产品默认支持,oracle数据库产品需要考虑本风险,及时规避.

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...