none
Transactions distribuées WCF avec Oracle 10g RRS feed

  • Question

  • Bonjour,

    Je débute avec WCF et j'aimerai avoir quelques précisions pour faire fonctionner les webs services transactionnels (endpoint avec ws-at) sur une machine client (xp sp2).

    J'ai suivi l'exemple fourni sur msdn calculatrice avec logs des opérations en mode transactionnels (WCF\Basic\Service\Behaviors\Transactions) en l'adaptant pour Oracle 10g (Version assembly : 2.102.2.20).

    L'exemple fonctionne en cas de Rollback (Tous mes appels au webs methods sont bien mis en rollback) mais lors d'une execution normal (sans exception), mon client par en exception :
       à System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
       à System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
       à System.Transactions.CommittableTransaction.Commit()
       à System.Transactions.TransactionScope.InternalDispose()
       à System.Transactions.TransactionScope.Dispose()
       à Microsoft.ServiceModel.Samples.Client.Main() dans C:\Samples\WCFWFCardSpace\WCF\Basic\Service\Behaviors\Transactions\CS\client
    ==> Message : La transaction a été interrompue.

    Mon Client :
    TransactionScope tx = null;
                CalculatorClient client = null;
                CalculatorClient client1 = null;
                try
                {
                    TransactionOptions opt = new TransactionOptions();
                    opt.IsolationLevel = IsolationLevel.ReadCommitted;
                    // Create a transaction scope with the default isolation level of Serializable
                    using (tx = new TransactionScope(TransactionScopeOption.RequiresNew, opt))
                    {
                        //Instanciation des services web
                        //Opération sur ces services
                        Console.WriteLine("  Completing transaction");
                        tx.Complete();
                        Console.WriteLine("Transaction committed");
                    }  //<-- Exception thrown here
               ....

    et coté services :
            [OperationContract]
            [TransactionFlow(TransactionFlowOption.Mandatory)]
            double Operation(double n);

    et implémentation :
           DbProviderFactory factory = DbProviderFactories.GetFactory(ConfigurationManager.AppSettings["providerName"]);
                    try
                    {
                        using (TransactionScope scope = new TransactionScope())
                        {
                            // Create first connection object.
                            using (DbConnection conn1 = factory.CreateConnection())
                            {

                                // Set connection string and open the connection. this connection
                                // will be automatically enlisted in a distributed transaction.
                                conn1.ConnectionString = ConfigurationManager.AppSettings["connectionString"];
                                conn1.Open();
                               
                                // Create a command to execute the sql statement.
                                DbCommand cmd1 = factory.CreateCommand();
                                cmd1.Connection = conn1;
                                cmd1.CommandText = "INSERT into TEST_LOG (ENTRY) Values (:Entry)";
                                DbParameter oParam = factory.CreateParameter();
                                oParam.ParameterName = "Entry";
                                oParam.Value = recordText;
                                cmd1.Parameters.Add(oParam);
                                cmd1.ExecuteNonQuery();
                                cmd1.Dispose();
                                scope.Complete();
                                conn1.Close();
                                conn1.Dispose();
                          }....

    Je n'arrive pas à comprendre pourquoi ?

    Merci d'avance pour vos réponse.
    mercredi 3 juin 2009 07:03

Toutes les réponses

  •  Bonjour,

    Au niveau de la chaine de connexion il est obligatoire pour Oracle de spécifier le mot clé Enlist = true afin que la transaction soit automatique inscrite au niveau du gestionnaire de transaction.

    Est-ce bien votre cas ?

    Bonne journée.
    arno
    vendredi 24 juillet 2009 10:15