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