WCF程序事務(wù)相關(guān)定義與實(shí)現(xiàn)方法詳解
WCF開發(fā)工具為我們帶來了非常大的好處。它的強(qiáng)大的功能優(yōu)勢令其在開發(fā)領(lǐng)域中占據(jù)著非常重要的地位。在這里我們將會(huì)為大家詳細(xì)介紹一下有關(guān)WCF程序事務(wù)的相關(guān)定義與實(shí)現(xiàn)方法,希望能對大家有所幫助。
WCF程序事務(wù)定義如下:
- [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);
- }
WCF程序事務(wù)實(shí)現(xiàn)如下:
- [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 = true, TransactionAutoComplete = true)]
- public void ExecuteNoneQuery1(string sql)
- {
- ExecuteNoneQuery(sql);
- //OperationContext.Current.SetTransactionComplete();
- }
- [OperationBehavior(
- TransactionScopeRequired = true, TransactionAutoComplete = true)]
- public void ExecuteNoneQuery2(string sql)
- {
- ExecuteNoneQuery(sql);
- //OperationContext.Current.SetTransactionComplete();
- }
- [OperationBehavior(
- TransactionScopeRequired = true, TransactionAutoComplete = true)]
- public void ExecuteNoneQuery3(string sql)
- {
- ExecuteNoneQuery(sql);
- //OperationContext.Current.SetTransactionComplete();
- }
服務(wù)端配置如下:
- < system.serviceModel>
- < !--提供的服務(wù)-->
- < 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>
客戶端代碼如下:
- 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();
- }
運(yùn)行結(jié)果:#t#
服務(wù)端的ExecuteNoneQuery方法中using (OracleConnection oraConnection = new OracleConnection(oraConnectionString))代碼塊發(fā)生異常,異常內(nèi)容如下:
"無法加載 DLL“oramts.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。"
結(jié)論:
對于數(shù)據(jù)庫事務(wù),可以通過WCF程序事務(wù)變形的方式來實(shí)現(xiàn),但必須獲取對應(yīng)數(shù)據(jù)庫產(chǎn)品的支持,sqlserver產(chǎn)品默認(rèn)支持,oracle數(shù)據(jù)庫產(chǎn)品需要考慮本風(fēng)險(xiǎn),及時(shí)規(guī)避.