Alla scoperta di System.Transactions ...

Nel WE ho preso a guardare uno dei nuovi namespace introdotti nella versione 2.0 del Framework: System.Transactions. (vedi "Introducing System.Transactions in the .NET Framework 2.0") Il namespace premette di _creare_ interessanti contesti transazionali.

Ecco l'esempio che mi sono costruito per vedere un semplice funzinamento. Per applicare l'esempio occorre un database (che supporti ovviamente le transazioni) e una coda di messaggi transazionale. Come prima cosa inizio a implementare funzionalità fine a se stesse che _apparamente_ ignorano l'esistenza/presenza di una transazione.

  class Table1Manager
  {
    string connectionString = "...";
    
    public void DeleteAllItems()
    {
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
        connection.Open();
        SqlCommand command = new SqlCommand("DELETE FROM Table1");
        command.CommandType = CommandType.Text;
        command.Connection = connection;
        command.ExecuteNonQuery();
        connection.Close();
      }
    }
  
    public void InsertABCDEF()
    {
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
        connection.Open();
        string[] values = {"A", "B", "C", "D", "E", "F" };
        foreach (string value in values)
        {
          SqlCommand command = new SqlCommand("INSERT INTO Table1 ([Value])VALUES (@Value)");
          command.CommandType = CommandType.Text;
          command.Connection = connection;
  
          SqlParameter valueParameter = new SqlParameter("@Value", SqlDbType.VarChar, 50);
          valueParameter.Value = value;
          command.Parameters.Add(valueParameter);
          
          command.ExecuteNonQuery();
        }
        connection.Close();
      }
    }
  }
  class LabQueueManager
  {
    public void Enqueue()
    {
      /// 'markino-mobile\private$\LabQueue' è una coda transazionale. 
      using (MessageQueue queue = new MessageQueue(@"FormatName:DIRECT=OS:markino-mobile\private$\LabQueue"))
      {
        queue.Send(string.Empty, DateTime.Now.ToString(), MessageQueueTransactionType.Automatic);        
      }      
    }
  }

LabQueueManager gestisce l'inserimento di un messaggio su una coda mentre Table1Manager gestisce l'inserimento e la cancellazione di elementi in una tabella con una sola colonna ([Value] VARCHAR(50) ). Proviamo ora a comporre una transazione con le nostre componenti senza modificarne il codice.

using (TransactionScope transaction = new TransactionScope())
{
  Table1Manager t1Manager = new Table1Manager();
  t1Manager.DeleteAllItems();
  t1Manager.InsertABCDEF();
 
  LabQueueManager qManager = new LabQueueManager();
  qManager.Enqueue();
 
  transaction.Complete();
}

Invocando il metodo Complete verrà notificato alla transazione implicitamente creata che le operazione sono completate. E' interssante lanciare la procedura commentando e scommentando la chiamata al metodo Complete. Questo che ho illustrato è davvero un granello confronto alle pontenzialità di System.Transactions... a poco a poco vedrò di snocciolarlo per bene ...perchè mi sembra di vedere qualcosa davvero interessante.

posted @ lunedì 5 dicembre 2005 15:46

Print

Comments on this entry:

# re: Alla scoperta di System.Transactions ...

Left by M.rkino at 07/12/2005 16:51
Gravatar
...ekkomi di ritorno dopo un approfondimento sulla questione propostami dalla domanda di (luka). ahimè le condizioni necessarie per rimanere nell'ambito di un LTM sono - per ora - abbastanza limitate... e ahimè quello che più mi ha lasciato di stucco è che anche rispettando le condizioni tecnologiche per LTM devo cmq mantenere viva la connessione nel corso delle varie operazioni: pena l'entrata in gioco di OleTx (DTC, Distributed Transactor Coordinator).

Ho inoltro intravisto qualche altro piccolo contro che illustrerò in un post dopo le feste. La conclusione è quindi: "bello e interessante Syetem.Transactions ma da usare con cognizione di causa!" :-D

Grazie (luka) per l'approfondimento proposto :-D
Comments have been closed on this topic.
«giugno»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789