Comment effectuer une transaction de validation Two-Phase sur TCP/IP

La validation en deux phases (2PC) est un protocole installé sur le serveur hôte qui garantit que les mises à jour de plusieurs instances d’une base de données sur un réseau réussissent ou échouent dans leur intégralité. Host Integration Server prend en charge 2PC sur TCP/IP, ce qui vous permet d’obtenir la sécurité d’une connexion 2PC sur Internet.

Host Integration Server prend en charge 2PC fonctionne à l’aide de deux composants : Microsoft Distributed Transaction Coordinator (DTC) et le journal des transactions. Le DTC régit le flux de transaction DTC normal : inscrire, préparer, valider et abandonner. En outre, DTC gère la récupération des transactions en cas d’échec ou de déconnexion, tandis que le journal des transactions conserve un journal des informations nécessaires en cas de récupération.

Vous pouvez effectuer une transaction 2PC avec ADO.NET et le Fournisseur managé pour DB2 à l’aide de l’espace System.Transactions de noms. L’utilisation d’une transaction 2PC est automatique lorsque vous configurez les unités de propriété de connexion de Work=DUW.

Exemple

L’exemple de code suivant montre comment utiliser 2PC dans une transaction DB2.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Data;  
using System.Transactions;  
using Microsoft.HostIntegration.MsDb2Client;  
  
namespace Db2DistributedTransaction  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Db2Tx();  
        }  
  
        static void Db2Tx()  
        {  
            string connectionStringDb2 = "Password=HISDEMO;User ID=HISDEMO;Initial Catalog=DSN1D037;Data Source=DSN8910;Network Transport Library=TCPIP;Host CCSID=37;PC Code Page=1208;Network Address=123.34.45.57;Network Port=446;Package Collection=HISDEMO;Default Schema=DSN8910;Default Qualifier=DSN8910;Units of Work=DUW;Defer Prepare=True;AutoCommit=False";  
            System.Transactions.CommittableTransaction transaction = new System.Transactions.CommittableTransaction();  
            MsDb2Connection connection = new MsDb2Connection(connectionStringDb2);  
            MsDb2Command command = new MsDb2Command();  
            try  
            {  
                connection.Open();  
                connection.EnlistTransaction(transaction);  
                command.Connection = connection;  
                command.CommandText = "INSERT INTO DSN8910.AREAS (AREAID, AREADESC, REGIONID) VALUES ('11111', 'Area 11111', 111)";  
                command.ExecuteNonQuery();  
                command.CommandText = "INSERT INTO DSN8910.AREAS (AREAID, AREADESC, REGIONID) VALUES ('22222', 'Area 22222', 222)";  
                command.ExecuteNonQuery();  
                while (true)  
                {  
                    Console.Write("Commit or Rollback? [C|R] ");  
                    ConsoleKeyInfo c = Console.ReadKey();  
                    Console.WriteLine();  
                    Console.ReadKey();  
  
                    if ((c.KeyChar == 'C') || (c.KeyChar == 'c'))  
                    {  
                        transaction.Commit();  
                        break;  
                    }  
                    else if ((c.KeyChar == 'R') || (c.KeyChar == 'r'))  
                    {  
                        transaction.Rollback();  
                        break;  
                    }  
                }  
                connection.Close();  
                transaction = null;  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Commit Exception Type: {0}", ex.GetType());  
                Console.WriteLine("  Message: {0}", ex.Message);  
                Console.ReadKey();  
            }  
            Console.WriteLine("Program end.");  
            Console.ReadKey();  
        }  
    }  

Voir aussi

Utilisation du fournisseur managé pour DB2