Дата публикации: 25.02.2014

Параллельные транзакции в рамках одного подключения. (C#)

using System;
using System.Data;
using lcpi.data.oledb;

using structure_lib=lcpi.lib.structure;

namespace Sample_0017{
////////////////////////////////////////////////////////////////////////////////
//class Program

class Program
{
 private const string c_cn_str
   ="provider=LCPI.IBProvider.3;"
   +"location=localhost:d:\\database\\employee.fdb;"
   +"user id=gamer;"
   +"password=vermut;";

 //-----------------------------------------------------------------------
 static int Main()
 {
  int resultCode=0;

  try // [catch]
  {
   OleDbConnection cn1=null;
   OleDbConnection cn2=null;

   OleDbTransaction tr1=null;
   OleDbTransaction tr2=null;

   try // [finally]
   {
    cn1=new OleDbConnection(c_cn_str);

    cn1.Open();

    cn2=cn1.CloneSession();

    //--------------------------------------
    tr1=cn1.BeginTransaction(IsolationLevel.RepeatableRead);

    tr2=cn2.BeginTransaction(IsolationLevel.RepeatableRead);

    //--------------------------------------
    Helper__PrintTrInfo("tr1",tr1);
    Helper__PrintTrInfo("tr2",tr2);

    Console.WriteLine("");

    //--------------------------------------
    tr1.Commit();
    tr2.Commit();
   }
   finally
   {
    structure_lib.DisposeUtils.Exec(ref tr1);
    structure_lib.DisposeUtils.Exec(ref tr2);

    structure_lib.DisposeUtils.Exec(ref cn1);
    structure_lib.DisposeUtils.Exec(ref cn2);
   }//finally
  }
  catch(Exception exc)
  {
   resultCode=1;

   Console.WriteLine("ERROR: {0} - {1}",exc.Source,exc.Message);
  }//catch

  return resultCode;
 }//Main

 //-----------------------------------------------------------------------
 private static void Helper__PrintTrInfo(string           sign,
                                         OleDbTransaction tr)
 {
  OleDbCommand    cmd=null;
  OleDbDataReader reader=null;

  try // [finally]
  {
   cmd=new OleDbCommand("select CURRENT_CONNECTION as c,\n"
                              +"CURRENT_TRANSACTION as t\n"
                        +"from RDB$DATABASE",
                        tr.Connection,
                        tr);

   reader=cmd.ExecuteReader();

   reader.Read();

   Console.WriteLine("{0}: cn_id: {1}, tr_id: {2}",
                     sign,
                     reader["c"],
                     reader["t"]);
  }
  finally
  {
   structure_lib.DisposeUtils.Exec(ref reader);
   structure_lib.DisposeUtils.Exec(ref cmd);
  }//finally
 }//Helper__PrintTrInfo
};//class Program

////////////////////////////////////////////////////////////////////////////////
}//namespace Sample_0017


Output of sample.
Вывод.