WCF程序事务相关定义与实现方法详解

开发 开发工具
我们在这篇文章中将会通过一段代码示例来为大家详细介绍一下WCF程序事务的定义以及具体的实现方法。大家可以从中充分掌握这一应用技术。

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

WCF程序事务定义如下:

 

[ServiceContract(SessionModeSessionMode = SessionMode.Required)]  
public interface IComplexService  
{  
[OperationContract]  
[TransactionFlow(TransactionFlowOption.Mandatory)]  
void ExecuteNoneQuery1(string sql);  
[OperationContract]  
[TransactionFlow(TransactionFlowOption.Mandatory)]  
void ExecuteNoneQuery2(string sql);  
[OperationContract]  
[TransactionFlow(TransactionFlowOption.Mandatory)]  
void ExecuteNoneQuery3(string sql);  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

 

WCF程序事务实现如下:

 

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

 

服务端配置如下:

 

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

 

客户端代码如下:

 

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

 

运行结果:#t#

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

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

结论:

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

责任编辑:曹凯 来源: CSDN
相关推荐

2010-02-24 17:36:33

WCF集合数据契约

2010-06-11 17:04:17

OSPF路由协议

2010-02-25 13:54:48

WCF安全参数

2009-12-30 11:16:36

Silverlight

2010-03-01 16:31:58

WCF实现SOA

2010-02-24 14:59:52

WCF自定义过滤器

2010-02-26 16:05:14

寄宿WCF服务

2010-02-24 11:22:04

WCF方法重载

2010-02-23 14:48:38

WCF事件通知

2010-03-01 09:19:10

WCF编码规范

2010-02-26 11:22:16

LitwareHR使用

2010-05-05 23:10:35

负载均衡器

2009-12-21 17:05:59

WCF自托管宿主

2010-02-26 14:39:27

WCF服务寄宿

2018-06-25 10:25:26

区块链跨链协议

2010-08-09 17:42:44

DB2 9.7自治事务

2009-12-22 16:36:38

WCF重载

2009-12-21 18:32:22

关闭WCF链接

2010-02-26 08:59:10

WCF服务宿主程序

2010-03-02 13:36:23

WCF事务投票
点赞
收藏

51CTO技术栈公众号