2011-06-29 128 views
0

在我的应用程序的事务范围不工作的第二transaction..It工作正常意味着,如果一个异常被抛出了第一个回滚事务,但第二个没..交易范围不适用于第二笔交易?对于第一笔交易

public string InsertRealm(string adminuser, string adminpassword, string CustomerCode, string CustomerName, string address, string email, string phone, string NoOfUsers, string ProductType) 
{ 

    try 
    { 
    using (Transactions.TransactionScope scope = new Transactions.TransactionScope(TransactionScopeOption.Required, new TimeSpan(2, 0, 0))) { 
     string _strServer = sqlmethod.Read_config("deploymentSetting", "Server"); 
     string _strDatabase = sqlmethod.Read_config("deploymentSetting", "database"); 
     string _strUserid = sqlmethod.Read_config("deploymentSetting", "username"); 
     string _strPassword = sqlmethod.Read_config("deploymentSetting", "password"); 
     string constr_str = "server=" + _strServer + ";" + "database=" + _strDatabase + ";" + "uid=" + _strUserid + ";" + "pwd=" + _strPassword + ";"; 

     string _blankdbCrm = sqlmethod.Read_config("dbSettings", "blankcrmdbName"); 
     string userCountdb = sqlmethod.Read_config("dbSettings", "userCountdb"); 
     string bakRestorePath = sqlmethod.Read_config("dbSettings", "bakRestorePath"); 
     string mdfRestorePath = sqlmethod.Read_config("dbSettings", "mdfRestorePath"); 
     string ldfRestorePath = sqlmethod.Read_config("dbSettings", "ldfRestorePath"); 
     string _dbCrm = ""; 

     con.ConnectionString = constr_str; 


     if (flag == "Yes") 
     { 
     SqlCommand cmddb = new SqlCommand("crt_crm_db_details", con); 
     cmddb.CommandType = CommandType.StoredProcedure; 
     cmddb.CommandTimeout = 0; 
     cmddb.Parameters.Add("@custname", SqlDbType.NVarChar).Value = ccode; 
     cmddb.Parameters.Add("@blank_dbname", SqlDbType.NVarChar).Value = _blankdbCrm; 
     cmddb.Parameters.Add("@blank_bakpath", SqlDbType.NVarChar).Value = bakRestorePath; 
     cmddb.Parameters.Add("@blank_mdfpath", SqlDbType.NVarChar).Value = mdfRestorePath; 
     cmddb.Parameters.Add("@blank_ldfpath", SqlDbType.NVarChar).Value = ldfRestorePath; 
     cmddb.Parameters.Add("@usercnt", SqlDbType.NVarChar).Value = userCountdb; 

     SqlParameter Typedb = new SqlParameter("@errorid", SqlDbType.NVarChar); 
     Typedb.Direction = ParameterDirection.Output; 
     Typedb.Value = null; 
     Typedb.Size = 50; 
     cmddb.Parameters.Add(Typedb); 
     try 
     { 
      con.Open(); 
      cmddb.ExecuteNonQuery(); 
     } 
     catch (SqlException ee) 
     { 
      VWLogger.LogMessage("Exception in crt_crm_db_details:", TraceEventType.Critical); 
      VWLogger.LogMessage(ee, TraceEventType.Critical); 
      return ee.Message; 
      flag = ee.Errors(0).ToString(); 
     } 
     con.Close(); 
     } 

     if (flag == "Yes") 
     { 
     Ramco.VW.Types.Message[] Msg_cust = null; 
     try 
     { 
      Msg_cust = client.addCustomer(ccode, cname, add1, "", mail); 
     } 
     catch (SqlException ex) 
     { 
      VWLogger.LogMessage("Exception in addCustomer:", TraceEventType.Critical); 
      VWLogger.LogMessage(ex, TraceEventType.Critical); 
      return ex.Message; 
      flag = ex.Errors(0).ToString(); 
     } 
     } 

     scope.Complete(); 
     return "Success"; 
    } 

    } 
    catch (Exception ex) 
    { 
    VWLogger.LogMessage("Exception in insertrealm:", TraceEventType.Critical); 
    VWLogger.LogMessage(ex, TraceEventType.Critical); 
    return ex.Message; 
    throw new CustomSoapException(CustomSoapException.ExceptionCode.AuthenticationException, ex.Message); 
    } 

} 

这里cmddb.ExecuteNonQuery()得到回滚,但这一个

Msg_cust = client.addCustomer(ccode, cname, add1, "", mail) 

没有得到回滚任何建议?

编辑:

<bindings> 
     <basicHttpBinding> 
     <binding name="UserNameTokenOverSSLBinding"> 
      <security mode="TransportWithMessageCredential" /> 
     </binding> 
     <binding name="BinaryCertTokenOverSSLBinding" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00"> 
      <security mode="TransportWithMessageCredential"> 
      <message clientCredentialType="Certificate" /> 
      </security> 
     </binding> 
     <binding name="Vw30BasicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="65536" maxReceivedMessageSize="65536"> 
      <security> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
     <customBinding> 
      <binding name="Vw30netTcpHABinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00"> 
      <binaryMessageEncoding> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binaryMessageEncoding> 
      <tcpTransport maxBufferPoolSize="524288" maxReceivedMessageSize="99999998" connectionBufferSize="8192" hostNameComparisonMode="StrongWildcard" channelInitializationTimeout="00:01:00" maxBufferSize="99999998" maxPendingConnections="20" maxOutputDelay="00:00:00.2000000" maxPendingAccepts="5" transferMode="Buffered" listenBacklog="20" portSharingEnabled="false" teredoEnabled="false"> 
      <connectionPoolSettings groupName="default" leaseTimeout="00:00:02" idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" /> 
      </tcpTransport> 
      </binding> 
      <binding name="Vw30HttpHABinding"> 
      <textMessageEncoding /> 
      <httpTransport keepAliveEnabled="false"> 
      </httpTransport> 
     </binding> 

     <binding name="UserNameTokenOverSSLOffloaderBinding"> 
      <textMessageEncoding messageVersion="Soap11" /> 
      <security authenticationMode="UserNameOverTransport"> 
      <secureConversationBootstrap /> 
      </security> 
      <sslOffloadedHttpsTransport /> 
     </binding> 
     <binding name="BinaryCertTokenOverSSLOffloaderBinding"> 
      <textMessageEncoding messageVersion="Soap11" /> 
      <security authenticationMode="UserNameOverTransport"> 
      <secureConversationBootstrap /> 
      </security> 
      <sslOffloadedHttpsTransport /> 
     </binding> 
     </customBinding> 
     <netTcpBinding> 
     <binding name="Vw30netTcpBinding" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" protectionLevel="None" /> 
      <message clientCredentialType="None" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
     <wsHttpBinding> 
     <binding name="WSUserNameBinding" transactionFlow="true"> 
      <security> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false" /> 
      </security> 
     </binding> 
     <binding name="WSBinaryCertBinding" transactionFlow="true"> 
      <security> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="Certificate" negotiateServiceCredential="false" establishSecurityContext="false" /> 
      </security> 
     </binding> 
     <binding name="WSUserNameReliableBinding" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" transactionFlow="true"> 
      <reliableSession enabled="true" /> 
      <security> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="UserName" negotiateServiceCredential="false" /> 
      </security> 
     </binding> 
     <binding name="WsBinaryCertReliableBinding" transactionFlow="true"> 
      <reliableSession enabled="true" /> 
      <security> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="Certificate" negotiateServiceCredential="false" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
+0

什么是'client'?它似乎是一个Web服务调用,在这种情况下,交易范围当然不适用。 –

+0

ya..its一个Web服务调用.. – bala3569

+0

但我要回滚also..what我必须做 – bala3569

回答

2

什么网络服务的类型,你打电话,和你拥有控制权?

如果这是一个WCF Web服务,并且您可以对其进行编辑,那么您可以使用WCF事务流程来控制来自客户端的事务。基本上,您的TransactionScope将成为一个分布式事务,并转移到WCF Web服务。您的交易将会正确回滚。

更多信息:

Enabling Transaction Flow (MSDN)

WCF Transaction Propagation (MSDN)

+0

这个。另请参见:http://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute.transactionoption(v=VS.100).aspx – Godeke

+0

是新来的this..how我可以检查是否矿是WCF Web服务或asp.net webservice..it可能是愚蠢的,但没办法 – bala3569

+0

在我的webconfig我有<的wsHttpBinding>所以我的是WCF web服务吗? – bala3569

0

事务范围选项必需指定如果存在数据库访问代码将加入现有的事务。如果即使第一个事务回滚,您也想提交第二个事务,则必须指定RequiresNew。

+0

人无我有回滚一切 – bala3569

+0

@ bala3569:我的错误!我以为你在谈论同一个数据库上的两个事务。您似乎试图实施分布式事务。 – Olaf

0

Web服务发生在不同的机器上的一个不同的线程(至少)或可能(甚至可能)。 TransactionScope是基于线程的。它的工作原理是根据当前线程注册的当前事务。因此,在进行Web服务调用时,无法使用此工具。

+0

但我已经创建了使用.svc文件的代理并声明了客户端,如VWSecurityServicesClient client = new VWSecurityServicesClient(“WSBinaryCert”); – bala3569

+0

你创建代理与你有什么关系?该代码仍在另一个应用程序域(或主机!)中运行。 Web服务可能运行在互联网上的其他地方。 (有可能是因为您使用的是证书)如何加入您的计算机上的交易? –

+0

看看我的编辑 – bala3569