Compartir a través de


Cómo realizar una transacción de confirmación de Two-Phase a través de TCP/IP

La confirmación en dos fases (2PC) es un protocolo instalado por el servidor host que garantiza que las actualizaciones de varias instancias de una base de datos en una red se realicen correctamente o produzcan errores en su totalidad. Host Integration Server admite 2PC a través de TCP/IP, lo que le permite obtener la seguridad de una conexión 2PC a través de Internet.

Host Integration Server admite el funcionamiento de 2PC mediante dos componentes: el Coordinador de Transacciones Distribuidas (DTC) de Microsoft y el registro de transacciones. El DTC rige el flujo de transacciones DTC normal: inscribir, preparar, confirmar y anular. Además, DTC controla la recuperación de transacciones en caso de error o desconexión, mientras que el registro de transacciones mantiene un registro de información que se necesita en caso de recuperación.

Puede realizar una transacción 2PC mediante el espacio de nombres System.Transactions con ADO.NET y el proveedor controlado por DB2. El uso de una transacción 2PC es automático cuando se configura la propiedad de conexión 'Units of Work=DUW'.

Ejemplo

En el ejemplo de código siguiente se muestra cómo usar 2PC en una transacción DB2.

Precaución

En este ejemplo o guía se hace referencia a información confidencial, como una cadena de conexión o un nombre de usuario y una contraseña. Nunca codifique de forma rígida estos valores en el código y asegúrese de proteger los datos confidenciales mediante la autenticación más segura disponible. Para más información, consulte la siguiente documentación:

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();  
        }  
    }
}

Véase también

Trabajar con el proveedor administrado para DB2