Académique Documents
Professionnel Documents
Culture Documents
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.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
Les transactions distribues .......................................................................................................... 17 3.1 3.2 Prsentation .......................................................................................................................... 17 Mise en uvre....................................................................................................................... 18
Conclusion ..................................................................................................................................... 21
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) 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.
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
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 :
// 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
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.
// 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(); } }
// 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.3.1
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; }
10
// 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 :
11
// 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;
Pour afficher les informations concernant les stagiaires, nous implmentons lvnement Click sur le bouton Rafrachir :
12
// 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); } }
13
// 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
14
// 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); } }
15
// 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 :
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.
17
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.
18
Serveur 1
(8') Restauration (8) Validation (5) Prparation pour la transaction Gestionnaire de ressources (6) Succs de la prparation (6') Echec de la prparation
(1) Cration dune transaction (2) Excution dune requte de mise jour de donnes au sein de la transaction
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
Transaction Distribue
Serveur 2
19
//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(); }
20
// 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
21
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.