Vous êtes sur la page 1sur 21

ADO .

NET : utilisation des transactions


Version 1.0

Harold CUNICO James RAVAILLE


http://blogs.dotnet-france.com/jamesr

ADO .NET : utilisation des transactions

Sommaire

Introduction ..................................................................................................................................... 3 1.1 1.2 1.3 Prsentation ............................................................................................................................ 3 Principes dexcution dune transaction ................................................................................. 3 Prsentation de la base de donnes ....................................................................................... 4 Cration de la base de donnes DotnetFranceA ............................................................. 4 Cration de la base de donnes DotnetFranceB ............................................................. 4

1.3.1 1.3.2 2

Les transactions locales ................................................................................................................... 6 2.1 Cration dune transaction locale ........................................................................................... 6 Prsentation .................................................................................................................... 6 Mise en uvre................................................................................................................. 6

2.1.1 2.1.2 2.2

Les niveaux disolations ........................................................................................................... 8 Prsentation .................................................................................................................... 8

2.2.1 2.3

Mise en uvre......................................................................................................................... 9 Prsentation du formulaire ............................................................................................. 9 Gestion des niveaux disolation de donnes ................................................................... 9 Gestion des donnes ..................................................................................................... 11 Excution de lapplication ............................................................................................. 15

2.3.1 2.3.2 2.3.3 2.3.4 3

Les transactions distribues .......................................................................................................... 17 3.1 3.2 Prsentation .......................................................................................................................... 17 Mise en uvre....................................................................................................................... 18

Conclusion ..................................................................................................................................... 21

Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

1 Introduction
1.1 Prsentation
Une transaction est un ensemble doprations ralises sur une base de donnes, excute de manire unitaire. En tant quunit, ces oprations sont valides uniquement si toutes ont t excutes avec succs (en application du principe tout ou rien ). Il existe quatre proprits connues sous le nom ACID qui dfinissent une transaction : Atomicit reprsente lintgralit des oprations effectues par une transaction : soit elles sont valides dans leur ensemble (commit), soit la transaction est annule (rollback). Cohrence reprsente lintgrit de la base de donne, que la transaction est tait valid ou annul, la base de donne doit rester intgre. Isolation, une transaction est indpendante dune autre transaction. Les transactions ne peuvent interfrer entre elles. Durabilit, les donnes sont prserves une fois la transaction acheve.

Ces proprits dmontrent tout lintrt des transactions quand plusieurs lignes (row) dune table doivent tre modifies. Quand une modification sur une table entraine des modifications sur dautres tables (contrainte de cl primaire). Ou bien encore dans tout autre cas qui porterait atteinte aux proprits ACID. Il existe deux types de transactions en ADO.net, les transactions locales et les transactions distribues. Les transactions locales sont des transactions simples qui effectuent des oprations sur une seule ressource (par exemple une base de donnes). Les transactions distribues quand elles, sont des transactions qui utilisent de nombreuses ressources.

1.2 Principes dexcution dune transaction


Le schma ci-dessous vous expose le principe dexcution dune transaction :
(3) Les donnes modifier sont charges en mmoire (4) Les modifications sont apportes sur ces donnes et les oprations effectues sont enregistres dans un fichier de transactions

(1) Cration dune transaction (2) Excution dune requte de mise jour de donnes au sein de la transaction

(3) Envoi de la requte (5) Validation de la transaction (5') Annulation de la transaction (6) Envoi dun commit (6') Envoi dun rollback Bases de donnes (7) Persistance des donnes modifies en mmoire (7') Abandon des donnes (8) Modification du journal des transactions Application

Les choix entre entre i et i sont raliss en fonction des choix de lutilisateur, ds ltape 5.

Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

1.3 Prsentation de la base de donnes


Dans les cas pratiques prsents dans ce cours, nous allons dans un premier temps utiliser une base de donnes SQL Server 2008 nomme DotnetFranceA. Puis, lorsque nous aborderons les transactions distribues, nous utiliserons une base de donnes supplmentaire nomme DotnetFranceB.

1.3.1

Cration de la base de donnes DotnetFranceA La base de donnes DotnetFranceA ne contient quune seule table, nomme Stagiaire. Voici un script SQL, permettant de crer cette table :
// SQL CREATE TABLE [dbo].[Stagiaire]( [id] [int] NOT NULL, [nom] [varchar](50) NULL, [prenom] [varchar](50) NULL, [adresse] [varchar](50) NULL, [telephone] [varchar](50) NULL, [mail] [varchar](50) NULL, [information] [varchar](500) NULL, CONSTRAINT [PK_Stagiaire] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], UNIQUE NONCLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO

Et voici un autre script permettant dalimenter cette table :


// SQL INSERT [dbo].[Stagiaire] ([id], [nom], [prenom], [adresse], [telephone], [mail], [information]) VALUES (1, N'PALUDETTO', N'Damien', N'0', N'0', N'0', N'0') INSERT [dbo].[Stagiaire] ([id], [nom], [prenom], [adresse], [telephone], [mail], [information]) VALUES (4, N'SAGARA', N'Sousuke', N'0', N'0', N'0', N'0') GO

1.3.2

Cration de la base de donnes DotnetFranceB La base de donnes DotnetFranceB ne contient quune seule table, nomme Manager. Voici un script SQL, permettant de crer cette table :

Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

// SQL CREATE TABLE [dbo].[Manager]( [id] [int] NOT NULL, [respId] [int] NULL, [nom] [varchar](50) NULL, [prenom] [varchar](50) NULL, [adresse] [varchar](50) NULL, [telephone] [varchar](50) NULL, [mail] [varchar](50) NULL, [information] [varchar](500) NULL, CONSTRAINT [PK_Manager] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], UNIQUE NONCLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO

Et voici un autre script permettant dalimenter cette table :


// SQL INSERT [dbo].[Manager] ([id], [respId], [nom], [telephone], [mail], [information]) VALUES (1, N'0', N'0', N'0', N'0') INSERT [dbo].[Manager] ([id], [respId], [nom], [telephone], [mail], [information]) VALUES (2, N'0', N'0', N'0', N'0') INSERT [dbo].[Manager] ([id], [respId], [nom], [telephone], [mail], [information]) VALUES (3, N'0', N'0', N'0', N'0') INSERT [dbo].[Manager] ([id], [respId], [nom], [telephone], [mail], [information]) VALUES (4, N'0', N'0', N'0', N'0') GO [prenom], [adresse], 1, N'Ravaille', N'0', [prenom], [adresse], 2, N'Vasselon', N'0', [prenom], [adresse], 3, N'Hollebecq', N'0', [prenom], [adresse], 4, N'Dominiquez', N'0',

Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

2 Les transactions locales


2.1 Cration dune transaction locale
2.1.1 Prsentation Pour crer une transaction en ADO.net, on utilise une classe drivant de la classe DbTransaction. Cette classe appartient lespace de nom System.Data.Common du composant System.data.dll du Framework .NET. Cette classe expose les mthodes BeginTransaction, Commit et Rollback, essentielles dans la mise en uvre des transactions. En fonction des classes daccs aux donnes utilises, vous utiliserez la classe suivante : System.Data.Odbc.OdbcTransaction System.Data.OleDb.OleDbTransaction System.Data.OracleClient.OracleTransaction System.Data.SqlClient.SqlTransaction

La mthode BeginTransaction permet de dbuter la transaction. La mthode Commit permet de valider les modifications effectues par les requtes excutes au sein de la transaction. La mthode Rollback permet dannuler ces modifications.

2.1.2

Mise en uvre Dans lexemple ci-dessous, nous utilisons une transaction, au sein de la quelle sont excutes deux requtes Insert sur une base de donnes SQL Server 2008. Nous utiliserons donc la classe SqlTransaction. Si les deux requtes sexcutant au sein de cette transaction sont excutes avec succs : Nous appliquons sur lobjet Transaction la mthode Commit, pour valider la transaction. Dans une bote de message, nous afficherons le message Transaction valide . Dans le cas o lexcution dune des deux requtes choue : Nous appliquons sur lobjet Transaction la mthode Rollback, pour annuler la transaction. Dans une bote de message, nous affichons le message derreur.

Dans notre cas, nous ajoutons un premier Stagiaire. Cet ajout sexcute normalement. Le second provoque la leve dune exception, car lajout dun stagiaire avec un identifiant existant provoque une violation dune contrainte de cl primaire. Ainsi, la transaction est annule, et aucun ajout nest effectu en base de donnes.

Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

// C#
string connectionString = "Data Source=NORBERT\\SQLEXPRESS;Initial Catalog=DotnetFrance;Integrated Security=true"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); SqlCommand commande = connection.CreateCommand(); commande.Transaction = transaction; try { //commande 1 commande.CommandText = "INSERT Stagiaire (id, nom, prenom, adresse,

telephone, mail, information) VALUES (7, 'DOLLON', 'Julien', '0', '0', '0', '0')";
commande.ExecuteNonQuery(); //commande 2 commande.CommandText = "INSERT Stagiaire (id, nom, prenom, adresse,

telephone, mail, information) VALUES (4, 'VERGNAULT', 'Bertrand', '0', '0', '0', '0')";
commande.ExecuteNonQuery(); transaction.Commit(); MessageBox.Show("Transaction valide"); } catch (Exception Ex) { transaction.Rollback(); MessageBox.Show(Ex.Message); } finally { connection.Close(); } }

Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

// VB .NET
Dim connectionString As String = "Data Source=NORBERT\SQLEXPRESS;Initial Catalog=DotnetFrance;Integrated Security=true" Using connection As New SqlConnection(connectionString) connection.Open() Dim transaction As SqlTransaction = connection.BeginTransaction() Dim commande As SqlCommand = connection.CreateCommand() commande.Transaction = transaction Try 'commande 1 commande.CommandText = "INSERT Stagiaire (id, nom, prenom, adresse,

telephone, mail, information) VALUES (7, 'DOLLON', 'Julien', '0', '0', '0', '0')"
commande.ExecuteNonQuery() commande.CommandText = "INSERT Stagiaire (id, nom, prenom, adresse, telephone, mail, information) VALUES (4, 'VERGNAULT', 'Bertrand', '0', '0', '0', '0')" commande.ExecuteNonQuery() transaction.Commit() MessageBox.Show("Transaction valide") Catch Ex As Exception transaction.Rollback() MessageBox.Show(Ex.Message) Finally connection.Close() End Try End Using

2.2 Les niveaux disolations


2.2.1 Prsentation Une application doit souvent grer de nombreuses transactions simultanment, ainsi que laccs aux donnes entre les diffrentes transactions. Vous trouverez ci-dessous la liste des proprits de lnumration IsolationLevel associes lobjet Transaction. Chaque proprit dfinie un niveau daccs aux donnes en cours de modification par dautres transactions en cours. Les donnes qui sont en cours de modification sont dites donnes volatiles. Chaos : les donnes en attente de transactions trs isoles ne peuvent tre crases. ReadComitted : les donnes volatiles ne peuvent pas tre lues pendant la transaction, mais peuvent tre modifies. ReadUncommitted : les donnes volatiles peuvent tre lues et modifies pendant la transaction. RepeatableRead : les donnes volatiles peuvent tre lues mais pas modifies pendant la transaction. De nouvelles donnes peuvent tre ajoutes. Serializable : niveau disolation par dfaut. Les donnes volatiles peuvent tre lue mais pas modifies. De mme aucune nouvelle donne ne peut tre ajoute pendant la transaction. Snapshot : les donnes volatiles peuvent tre lues. La transaction vrifie que les donnes initiales nont pas changes avant de valider la transaction. Cela permet de rgler les problmes lis laccs concurrentiels aux donnes. Unspecified : aucun niveau ne peut tre dtermin. Dotnet France Association James RAVAILLE / Harold CUNICO

ADO .NET : utilisation des transactions

2.3 Mise en uvre


Nous allons maintenant crer une petite application, permettant de grer en mode CRUD (Create, Read, Update, Delete) les donnes contenues dans la table. Ces donnes seront lues au sein dune transaction, puis affiches. Nous aurons la possibilit de choisir un niveau disolation des donnes. Puis, nous lancerons deux instances de notre application, afin de mettre lvidence lutilisation des transactions et des niveaux disolation.

2.3.1

Prsentation du formulaire Le formulaire que nous allons raliser est le suivant :

Il permet : Dafficher la liste des stagiaires, tout en nous laissant la possibilit de verrouiller des donnes, via lutilisation dune transaction. Les niveaux de visibilit Chaos et Snapshot sont griss, car ils ne sont pas applicables la base de donnes SQL Server telle quelle (nomme DotnetFranceA). Dannuler les modifications de donnes effectues dans la grille. Denregistrer les modifications en base de donnes.

2.3.2

Gestion des niveaux disolation de donnes Nous implmentons lvnement CheckedChanged le contrle CheckBox intitul Utiliser une transaction , afin dactiver ou non la liste des niveaux de visibilit :
// C# private void ChkUtiliserTransaction_CheckedChanged(object sender, EventArgs e) { GbxNiveauxIsolation.Enabled = ChkUtiliserTransaction.Checked; }

Dotnet France Association James RAVAILLE / Harold CUNICO

10

ADO .NET : utilisation des transactions

// VB .NET Private Sub ChkUtiliserTransaction_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChkUtiliserTransaction.CheckedChanged GbxNiveauxIsolation.Enabled = ChkUtiliserTransaction.Checked End Sub

Pour grer les diffrents niveaux disolation nous affection chaque bouton radio, un niveau disolation de donnes qui lui est propre, lors du chargement du formulaire. Pour ce faire, nous utilisons la proprit Tag, prsente sur lensemble des contrles Windows Forms.
// C# private void FrmIsolationDonnees_Load(object sender, EventArgs e) { RbtChaos.Tag = IsolationLevel.Chaos; RbtReadComitted.Tag = IsolationLevel.ReadCommitted; RbtReadUncommitted.Tag = IsolationLevel.ReadUncommitted; RbtRepeatableRead.Tag = IsolationLevel.RepeatableRead; RbtSerializable.Tag = IsolationLevel.Serializable; RbtSnapshot.Tag = IsolationLevel.Snapshot; RbtUnspecified.Tag = IsolationLevel.Unspecified; RbtUnspecified.Checked = true; }

// VB .NET Private Sub FrmIsolationDonnees_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load RbtChaos.Tag = IsolationLevel.Chaos RbtReadComitted.Tag = IsolationLevel.ReadCommitted RbtReadUncommitted.Tag = IsolationLevel.ReadUncommitted RbtRepeatableRead.Tag = IsolationLevel.RepeatableRead RbtSerializable.Tag = IsolationLevel.Serializable RbtSnapshot.Tag = IsolationLevel.Snapshot RbtUnspecified.Tag = IsolationLevel.Unspecified RbtUnspecified.Checked = True End Sub

Pour utiliser ultrieurement le niveau de visibilit choisi, on dclare dans le formulaire un niveau disolation. Puis nous le valorisons dans le gestionnaire dvnement prsent ci-dessous :

Dotnet France Association James RAVAILLE / Harold CUNICO

11

ADO .NET : utilisation des transactions

// C# IsolationLevel oNiveauIsolationDonnees; private void RbtIsolationDonnees_CheckedChanged(object sender, EventArgs e) { oNiveauIsolationDonnees = (IsolationLevel)((RadioButton)sender).Tag; }

// VB .NET Private Sub RbtIsolationDonnees_CheckedChanged (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RbtChaos.CheckedChanged oNiveauIsolationDonnees = CType(CType(sender, RadioButton).Tag, IsolationLevel) End Sub

Ce gestionnaire dvnement doit tre abonn lvnement CheckedChanged de tous les contrles radio boutons dsignant un niveau disolation de donnes.

2.3.3

Gestion des donnes Dans les diffrentes mthodes du formulaire, nous allons manipuler un DataAdapter et une table de donnes. Nous dclarons alors les deux attributs suivants :
// C# SqlDataAdapter oDataAdapter; DataTable oTable;

// VB .NET Dim oDataAdapter As SqlDataAdapter Dim oTable As DataTable

Pour afficher les informations concernant les stagiaires, nous implmentons lvnement Click sur le bouton Rafrachir :

Dotnet France Association James RAVAILLE / Harold CUNICO

12

ADO .NET : utilisation des transactions

// C# private void CmdRafraichir_Click(object sender, EventArgs e) { // Variables locales. SqlConnection oConnexion; SqlTransaction oTransaction = null; SqlCommand oCommande; try { // Cration de la connexion. oConnexion = new SqlConnection(@"Data Source=localhost\SQL2008; Initial Catalog=DotnetFranceA; integrated security=true;"); // Ouverture de la connexion. oConnexion.Open(); if (ChkUtiliserTransaction.Checked) { // Cration de la transaction. oTransaction = oConnexion.BeginTransaction(oNiveauIsolationDonnees); } // Cration de la commande. oCommande = new SqlCommand("SELECT * FROM Stagiaire", oConnexion, oTransaction); // Cration et paramtrage du DataDapter. oDataAdapter = new SqlDataAdapter(oCommande); SqlCommandBuilder oCommandBuilder = new SqlCommandBuilder(oDataAdapter); // Cration de la table de donnes. oTable = new DataTable("Stagiaire"); // Excution de la requte et remplissage de la table de donnes. oDataAdapter.Fill(oTable); // Affichage des donnes. LstStagiaires.DataSource = oTable; } catch (Exception aEx) { MessageBox.Show(aEx.Message); } }

Dotnet France Association James RAVAILLE / Harold CUNICO

13

ADO .NET : utilisation des transactions

// VB .NET Private Sub CmdRafraichir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdRafraichir.Click ' Variables locales. Dim oConnexion As SqlConnection Dim oTransaction As SqlTransaction = Nothing Dim oCommande As SqlCommand Try ' Cration de la connexion. oConnexion = New SqlConnection("Data Source=localhost\SQL2008; Initial Catalog=DotnetFranceA; integrated security=true;") ' Ouverture de la connexion. oConnexion.Open() If (ChkUtiliserTransaction.Checked) Then ' Cration de la transaction. oTransaction = oConnexion.BeginTransaction(oNiveauIsolationDonnees) End If ' Cration de la commande. oCommande = New SqlCommand("SELECT * FROM Stagiaire", oConnexion, oTransaction) ' Cration et paramtrage du DataDapter. oDataAdapter = New SqlDataAdapter(oCommande) Dim oCommandBuilder As New SqlCommandBuilder(oDataAdapter) ' Cration de la table de donnes. oTable = New DataTable("Stagiaire") ' Excution de la requte et remplissage de la table de donnes. oDataAdapter.Fill(oTable) ' Affichage des donnes. LstStagiaires.DataSource = oTable Catch aEx As Exception MessageBox.Show(aEx.Message) End Try End Sub

Pour enregistrer les modifications dans la base de donnes :

Dotnet France Association James RAVAILLE / Harold CUNICO

14

ADO .NET : utilisation des transactions

// C# private void CmdEnregistrer_Click(object sender, EventArgs e) { try { if (oDataAdapter != null) { oDataAdapter.Update(oTable); } } catch (Exception aEx) { MessageBox.Show(aEx.Message); } }

// VB .NET Private Sub CmdEnregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdEnregistrer.Click Try If oDataAdapter Is Nothing Then oDataAdapter.Fill(oTable) End If Catch aEx As Exception MessageBox.Show(aEx.Message) End Try End Sub

Pour annuler les modifications effectues depuis le chargement des donnes ou le dernier enregistrement :
// C# private void CmdAnnuler_Click(object sender, EventArgs e) { try { if (oTable != null) { oTable.RejectChanges(); } } catch (Exception aEx) { MessageBox.Show(aEx.Message); } }

Dotnet France Association James RAVAILLE / Harold CUNICO

15

ADO .NET : utilisation des transactions

// VB .NET Private Sub CmdAnnuler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAnnuler.Click Try If oTable Is Nothing Then oTable.RejectChanges() End If Catch aEx As Exception MessageBox.Show(aEx.Message) End Try End Sub

2.3.4

Excution de lapplication Pour mettre en vidence lutilisation de notre transaction, il faut lancer deux instances de lapplication. Pour ce faire, nous allons nous positionner dans le rpertoire bin\debug de notre projet, et excuter deux fois le fichier ADO_Transactions_CS.exe. Deux formulaires apparaissent alors :

Dotnet France Association James RAVAILLE / Harold CUNICO

16

ADO .NET : utilisation des transactions Dans la premire instance (celle du haut), on slectionne le niveau disolation de donnes Serializable . Pour rappel, les donnes peuvent tre lues, mais ne peuvent tre modifies. Puis on clique sur le bouton Rafrachir. Les donnes apparaissent. Dans la seconde instance (celle du bas), on cliquer sur le bouton Rafrachir. Puis on modifie le prnom dun stagiaire, et on clique sur le bouton Enregistrer :

On remarque quune exception est leve. Le message derreur affich montre quun TImeOut est survenu. Lenregistrement des donnes na pu tre effectu. Nous pouvons donc constater que les donnes ont bien t verrouilles en criture par la transaction de la premire instance de lapplication.

Dotnet France Association James RAVAILLE / Harold CUNICO

17

ADO .NET : utilisation des transactions

3 Les transactions distribues


3.1 Prsentation
Une transaction distribue, est une transaction qui fait appelle plusieurs ressources. Pour cela la transaction utilise des gestionnaires de ressources qui sont eux mme grs par un gestionnaire de transaction. Comme gestionnaire de transaction on utilisera le DTC (Distributed Transaction Coordinator). Ce dernier peut ncessiter dtre dmarr manuellement, sans quoi une erreur pourrait se produire lors de la compilation de lexemple de transaction distribue que lon verra dans la partie 3.2. Pour cela allez dans les Services (tapez Services.msc dans cmd), faites un clique droit sur le service en question et cliquez sur dmarrer.

Lorsquune transaction est amorce dans une application, une requte de validation est envoye au gestionnaire de transaction. Ce dernier enverra une commande de prparation tous les gestionnaires de ressources de la transaction. Aprs traitement de la commande les gestionnaires de ressources enverront leur tour un message dchec ou de succs de prparation au gestionnaire de transaction. Si un message dchec a t envoy par au moins un gestionnaire de ressources, le gestionnaire de transaction envoie alors une commande de restauration tous les gestionnaires de ressources, puis envoie un message dchec de la transaction lapplication. Si seulement des messages de succs ont t envoys, le gestionnaire de transaction envoie alors une commande de validation tous les gestionnaires de ressources. Aprs validation le gestionnaire de ressource confirme la validation au gestionnaire de ressource, qui son tour confirme le succs de la transaction lapplication.

Comme le montre le schma, ce systme de validation deux phases permet de sassurer que la transaction respecte les proprits ACID, avec aucune diffrence de traitement des commandes par un gestionnaire de ressources compar un autre.

Dotnet France Association James RAVAILLE / Harold CUNICO

18

ADO .NET : utilisation des transactions

Serveur 1
(8') Restauration (8) Validation (5) Prparation pour la transaction Gestionnaire de ressources (6) Succs de la prparation (6') Echec de la prparation

(7') Commande de restauration (7) Commande de validation (4) Commande de prparation

(1) Cration dune transaction (2) Excution dune requte de mise jour de donnes au sein de la transaction

(3) Envoie dune requte de validation

Succs de validation (9)

Gestionnaire de transactions
(6) Succs de la prparation (6') Echec de la prparation (10) Succs de la transaction (9') Echec de la transaction

application

Succs de validation (9) Gestionnaire de ressources (5) Prparation pour la transaction (8) Validation (8') Restauration

(4) Commande de prparation (7) Commande de validation (7') Commande de restauration

Transaction Distribue

Serveur 2

3.2 Mise en uvre


Pour crer une transaction distribue on utilise lespace de nom System.Transactions. Il ne faut pas oublier dajouter la rfrence correspondante (System.Transactions.dll). Lespace de nom System.Transactions permet dutiliser lobjet TransactionScope. Par dfaut TransactionScope cre une transaction simple, cependant cette dernire pourra voluer vers une transaction distributive, cest le cas lorsque la transaction fera appel plus dune base de donnes (voir lexemple). On utilise le mot cl Using pour crer un objet de type TransactionScope, la mthode Dispose sera alors gnre automatiquement la fin de celui-ci. La mthode Complete permet de valider la transaction si les commandes ont bien t excutes. Dans le cas contraire, la transaction est annule et la base de donnes retrouve son tat initial.

Dotnet France Association James RAVAILLE / Harold CUNICO

19

ADO .NET : utilisation des transactions

//C# string connectionString1 = "Data Source=NORBERT\\SQLEXPRESS;Initial Catalog=DotnetFrance;Integrated Security=true"; string connectionString2 = "Data Source=NORBERT\\SQLEXPRESS;Initial Catalog=dnFrance;Integrated Security=true"; using (TransactionScope Transaction = new TransactionScope()) { using (SqlConnection connection1 = new SqlConnection(connectionString1)) { try { SqlCommand commande = connection1.CreateCommand(); commande.CommandText = "DELETE FROM Stagiaire WHERE nom like 'PIERRE';"; connection1.Open(); commande.ExecuteNonQuery(); connection1.Close(); using (SqlConnection connection2 = new SqlConnection(connectionString2)) try { SqlCommand commande2 = connection2.CreateCommand(); commande.CommandText = "DELETE FROM Manager WHERE nom like 'Tartonpion';"; connection1.Open(); commande.ExecuteNonQuery(); connection2.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } Transaction.Complete(); }

Dotnet France Association James RAVAILLE / Harold CUNICO

20

ADO .NET : utilisation des transactions

// VB.net Dim connectionString1 As String = "Data Source=NORBERT\SQLEXPRESS;Initial Catalog=DotnetFrance;Integrated Security=true" Dim connectionString2 As String = "Data Source=NORBERT\SQLEXPRESS;Initial Catalog=dnFrance;Integrated Security=true" Using Transaction As New TransactionScope() Using connection1 As New SqlConnection(connectionString1) Try Dim commande As SqlCommand = connection1.CreateCommand() commande.CommandText = "DELETE FROM Stagiaire WHERE nom like 'PIERRE';"_ connection1.Open() commande.ExecuteNonQuery() connection1.Close() Using connection2 As New SqlConnection(connectionString2)_ Try Dim commande2 As SqlCommand = connection2.CreateCommand()_ commande.CommandText = "DELETE FROM Manager WHERE nom like 'Tartonpion';"_ connection1.Open() commande.ExecuteNonQuery() connection2.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Using Catch ex As Exception MessageBox.Show(ex.Message) End Try End Using Transaction.Complete() End Using

Dotnet France Association James RAVAILLE / Harold CUNICO

21

ADO .NET : utilisation des transactions

4 Conclusion
Ce cours vous a permis dutiliser les transactions proposes par le Framework .NET, dans laccs aux donnes contenues dans une base de donnes. Trois points essentiels sont retenir : Lutilisation des transactions permet dexcuter un lot de requtes en respectant les proprits ACID. Lutilisation des transactions pour verrouiller des donnes. Lutilisation des transactions distribues.

Dotnet France Association James RAVAILLE / Harold CUNICO