ADO .NET - Utilisation des Transactions.pdf
-
Upload
wenceslas-dima -
Category
Documents
-
view
231 -
download
0
Transcript of ADO .NET - Utilisation des Transactions.pdf
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
1/21
ADO .NET : utilisation des
transactionsVersion 1.0
James RAVAILLE
http://blogs.dotnet-france.com/jamesr
Harold CUNICO
http://blogs.dotnet-france.com/jamesrhttp://blogs.dotnet-france.com/jamesrhttp://blogs.dotnet-france.com/jamesr -
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
2/21
Dotnet France Association James RAVAILLE / Harold CUNICO
2 ADO .NET : utilisation des transactions
Sommaire
1 Introduction ..................................................................................................................................... 3
1.1 Prsentation ............................................................................................................................ 3
1.2 Principes dexcution dune transaction ................................................................................. 3
1.3 Prsentation de la base de donnes ....................................................................................... 4
1.3.1 Cration de la base de donnes DotnetFranceA............................................................. 4
1.3.2 Cration de la base de donnes DotnetFranceB ............................................................. 4
2 Les transactions locales ................................................................................................................... 6
2.1 Cration dune transaction locale ........................................................................................... 6
2.1.1 Prsentation .................................................................................................................... 6
2.1.2 Mise en uvre................................................................................................................. 6
2.2 Les niveaux disolations ........................................................................................................... 8
2.2.1 Prsentation .................................................................................................................... 8
2.3 Mise en uvre......................................................................................................................... 9
2.3.1 Prsentation du formulaire ............................................................................................. 9
2.3.2 Gestion des niveaux disolation de donnes ................................................................... 9
2.3.3 Gestion des donnes ..................................................................................................... 11
2.3.4 Excution de lapplication ............................................................................................. 15
3 Les transactions distribues .......................................................................................................... 17
3.1 Prsentation .......................................................................................................................... 17
3.2 Mise en uvre....................................................................................................................... 18
4 Conclusion ..................................................................................................................................... 21
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
3/21
Dotnet France Association James RAVAILLE / Harold CUNICO
3 ADO .NET : utilisation des transactions
1 Introduction1.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 texcutes 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 ellessont 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 ouannul, la base de donne doit rester intgre.
- Isolation, une transaction est indpendante dune autre transaction. Les transactions nepeuvent 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 transactionLe schma ci-dessous vous expose le principe dexcution dune transaction :
Bases de donnes
Application
(1) Cration dune transaction
(2) Excution dune requte de mise jour
de donnes au sein de la transaction
(3) Envoi de la requte
(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
(5) Validation de la transaction
(5') Annulation de la transaction
(6) Envoi dun commit
(6') Envoi dun rollback
(7) Persistance des donnes modifies en mmoire
(7') Abandon des donnes
(8) Modification du journal des transactions
Les choix entre entre iet isont raliss en fonction des choix de lutilisateur, ds ltape 5.
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
4/21
Dotnet France Association James RAVAILLE / Harold CUNICO
4 ADO .NET : utilisation des transactions
1.3 Prsentation de la base de donnesDans 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 DotnetFranceALa base de donnes DotnetFranceAne contient quune seule table, nomme Stagiaire. Voici
un script SQL, permettant de crer cette table :
Et voici un autre script permettant dalimenter cette table :
1.3.2 Cration de la base de donnes DotnetFranceBLa base de donnes DotnetFranceBne contient quune seule table, nomme Manager. Voici
un script SQL, permettant de crer 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
// SQL
CREATETABLE[dbo].[Stagiaire]([id][int]NOTNULL,[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]PRIMARYKEYCLUSTERED(
[id]ASC)WITH (PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS =ON)ON[PRIMARY],UNIQUENONCLUSTERED(
[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
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
5/21
Dotnet France Association James RAVAILLE / Harold CUNICO
5 ADO .NET : utilisation des transactions
Et voici un autre script permettant dalimenter cette table :
// SQL
INSERT[dbo].[Manager]([id],[respId],[nom],[prenom],[adresse],[telephone],[mail],[information])VALUES (1, 1,N'Ravaille',N'0',N'0',N'0',N'0',N'0')
INSERT[dbo].[Manager]([id],[respId],[nom],[prenom],[adresse],[telephone],[mail],[information])VALUES (2, 2,N'Vasselon',N'0',N'0',N'0',N'0',N'0')INSERT[dbo].[Manager]([id],[respId],[nom],[prenom],[adresse],[telephone],[mail],[information])VALUES (3, 3,N'Hollebecq',N'0',N'0',N'0',N'0',N'0')INSERT[dbo].[Manager]([id],[respId],[nom],[prenom],[adresse],[telephone],[mail],[information])VALUES (4, 4,N'Dominiquez',N'0',N'0',N'0',N'0',N'0')GO
// SQL
CREATETABLE[dbo].[Manager]([id][int]NOTNULL,[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]PRIMARYKEYCLUSTERED(
[id]ASC)WITH (PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS =ON)ON[PRIMARY],UNIQUENONCLUSTERED(
[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
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
6/21
Dotnet France Association James RAVAILLE / Harold CUNICO
6 ADO .NET : utilisation des transactions
2 Les transactions locales2.1 Cration dune transaction locale2.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.dlldu Framework .NET. Cette classe expose les mthodes BeginTransaction, Commitet
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 Commitpermet
de valider les modifications effectues par les requtes excutes au sein de la transaction. La
mthode Rollbackpermet dannuler ces modifications.
2.1.2 Mise en uvreDans 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 mthodeRollback, 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.
http://msdn.microsoft.com/fr-fr/library/system.data.common.aspxhttp://msdn.microsoft.com/fr-fr/library/system.data.common.aspx -
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
7/21
Dotnet France Association James RAVAILLE / Harold CUNICO
7 ADO .NET : utilisation des transactions
// C#
string connectionString = "Data Source=NORBERT\\SQLEXPRESS;InitialCatalog=DotnetFrance;Integrated Security=true";using (SqlConnection connection = newSqlConnection(connectionString)){
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();SqlCommand commande = connection.CreateCommand();commande.Transaction = transaction;
try{
//commande 1
commande.CommandText = "INSERTStagiaire(id,nom,prenom,adresse,telephone,mail,information)VALUES (7,'DOLLON','Julien','0','0','0','0')";
commande.ExecuteNonQuery();
//commande 2
commande.CommandText = "INSERTStagiaire(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();
}}
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
8/21
Dotnet France Association James RAVAILLE / Harold CUNICO
8 ADO .NET : utilisation des transactions
2.2 Les niveaux disolations2.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 IsolationLevelassocies 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 latransaction.
- RepeatableRead : les donnes volatiles peuvent tre lues mais pas modifies pendant latransaction. De nouvelles donnes peuvent tre ajoutes.
- Serializable: niveau disolation par dfaut. Les donnes volatiles peuvent tre lue mais pasmodifies. De mme aucune nouvelle donne ne peut tre ajoute pendant la transaction.
- Snapshot : les donnes volatiles peuvent tre lues. La transaction vrifie que les donnesinitiales 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.
// VB .NET
Dim connectionString AsString = "Data Source=NORBERT\SQLEXPRESS;InitialCatalog=DotnetFrance;Integrated Security=true"Using connection AsNew SqlConnection(connectionString)
connection.Open()Dim transaction As SqlTransaction = connection.BeginTransaction()
Dim commande As SqlCommand = connection.CreateCommand()commande.Transaction = transaction
Try'commande 1
commande.CommandText = "INSERTStagiaire(id,nom,prenom,adresse,telephone,mail,information)VALUES (7,'DOLLON','Julien','0','0','0','0')"
commande.ExecuteNonQuery()
commande.CommandText = "INSERTStagiaire(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 Exceptiontransaction.Rollback()MessageBox.Show(Ex.Message)
Finallyconnection.Close()
EndTryEndUsing
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
9/21
Dotnet France Association James RAVAILLE / Harold CUNICO
9 ADO .NET : utilisation des transactions
2.3 Mise en uvreNous 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 formulaireLe formulaire que nous allons raliser est le suivant :
Il permet :
- Dafficher la liste des stagiaires, tout en nous laissant la possibilit de verrouiller desdonnes, 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 donnesNous implmentons lvnement CheckedChanged le contrle CheckBox intitul Utiliser
une transaction , afin dactiver ou non la liste des niveaux de visibilit :
// C#
privatevoid ChkUtiliserTransaction_CheckedChanged( object sender,EventArgs e)
{GbxNiveauxIsolation.Enabled = ChkUtiliserTransaction.Checked;
}
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
10/21
Dotnet France Association James RAVAILLE / Harold CUNICO
10 ADO .NET : utilisation des transactions
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.
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 :
// VB .NET
PrivateSub FrmIsolationDonnees_Load(ByVal sender As System.Object, ByVale As System.EventArgs) HandlesMyBase.Load
RbtChaos.Tag = IsolationLevel.ChaosRbtReadComitted.Tag = IsolationLevel.ReadCommittedRbtReadUncommitted.Tag = IsolationLevel.ReadUncommittedRbtRepeatableRead.Tag = IsolationLevel.RepeatableReadRbtSerializable.Tag = IsolationLevel.SerializableRbtSnapshot.Tag = IsolationLevel.SnapshotRbtUnspecified.Tag = IsolationLevel.Unspecified
RbtUnspecified.Checked = True
EndSub
// C#
privatevoid 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
PrivateSub ChkUtiliserTransaction_CheckedChanged( ByVal sender AsSystem.Object, ByVal e As System.EventArgs) HandlesChkUtiliserTransaction.CheckedChanged
GbxNiveauxIsolation.Enabled = ChkUtiliserTransaction.CheckedEndSub
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
11/21
Dotnet France Association James RAVAILLE / Harold CUNICO
11 ADO .NET : utilisation des transactions
Ce gestionnaire dvnement doit tre abonn lvnement CheckedChangedde tous lescontrles radio boutons dsignant un niveau disolation de donnes.
2.3.3 Gestion des donnesDans les diffrentes mthodes du formulaire, nous allons manipuler un DataAdapteret une
table de donnes. Nous dclarons alors les deux attributs suivants :
Pour afficher les informations concernant les stagiaires, nous implmentons lvnement
Clicksur le bouton Rafrachir:
// VB .NET
Dim oDataAdapter As SqlDataAdapterDim oTable As DataTable
// C#
SqlDataAdapter oDataAdapter;DataTable oTable;
// VB .NET
PrivateSub RbtIsolationDonnees_CheckedChanged (ByVal sender AsSystem.Object, ByVal e As System.EventArgs) Handles RbtChaos.CheckedChanged
oNiveauIsolationDonnees = CType(CType(sender, RadioButton).Tag,IsolationLevel)EndSub
// C#
IsolationLevel oNiveauIsolationDonnees;
privatevoid RbtIsolationDonnees_CheckedChanged( object sender, EventArgs e){
oNiveauIsolationDonnees = (IsolationLevel)((RadioButton)sender).Tag;
}
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
12/21
Dotnet France Association James RAVAILLE / Harold CUNICO
12 ADO .NET : utilisation des transactions
// C#
privatevoid CmdRafraichir_Click(object sender, EventArgs e){
// Variables locales.SqlConnection oConnexion;SqlTransaction oTransaction = null;
SqlCommand oCommande;
try{
// Cration de la connexion.oConnexion = newSqlConnection(@"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 = newSqlCommand("SELECT * FROM Stagiaire", oConnexion,
oTransaction);
// Cration et paramtrage du DataDapter.oDataAdapter = newSqlDataAdapter(oCommande);SqlCommandBuilder oCommandBuilder = new
SqlCommandBuilder(oDataAdapter);
// Cration de la table de donnes.oTable = newDataTable("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);
}}
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
13/21
Dotnet France Association James RAVAILLE / Harold CUNICO
13 ADO .NET : utilisation des transactions
Pour enregistrer les modifications dans la base de donnes :
// VB .NET
PrivateSub CmdRafraichir_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles CmdRafraichir.Click
' Variables locales.Dim oConnexion As SqlConnectionDim 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)EndIf
' Cration de la commande.oCommande = New SqlCommand("SELECT * FROM Stagiaire", oConnexion,
oTransaction)
' Cration et paramtrage du DataDapter.oDataAdapter = New SqlDataAdapter(oCommande)Dim oCommandBuilder AsNew 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 ExceptionMessageBox.Show(aEx.Message)
EndTryEndSub
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
14/21
Dotnet France Association James RAVAILLE / Harold CUNICO
14 ADO .NET : utilisation des transactions
Pour annuler les modifications effectues depuis le chargement des donnes ou le dernier
enregistrement :
// C#
privatevoid CmdAnnuler_Click(object sender, EventArgs e){
try{
if (oTable != null)
{ oTable.RejectChanges();}
}catch (Exception aEx){
MessageBox.Show(aEx.Message);}
}
// VB .NET
PrivateSub CmdEnregistrer_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles CmdEnregistrer.Click
TryIf oDataAdapter IsNothingThen
oDataAdapter.Fill(oTable)EndIf
Catch aEx As ExceptionMessageBox.Show(aEx.Message)
EndTryEndSub
// C#
privatevoid CmdEnregistrer_Click(object sender, EventArgs e){
try{
if (oDataAdapter != null)
{oDataAdapter.Update(oTable);
}}catch (Exception aEx){
MessageBox.Show(aEx.Message);}
}
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
15/21
Dotnet France Association James RAVAILLE / Harold CUNICO
15 ADO .NET : utilisation des transactions
2.3.4 Excution de lapplicationPour 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 :
// VB .NET
PrivateSub CmdAnnuler_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles CmdAnnuler.Click
TryIf oTable IsNothingThen
oTable.RejectChanges()
EndIfCatch aEx As Exception
MessageBox.Show(aEx.Message)EndTry
EndSub
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
16/21
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.
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
17/21
Dotnet France Association James RAVAILLE / Harold CUNICO
17 ADO .NET : utilisation des transactions
3 Les transactions distribues3.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, legestionnaire de transaction envoie alors une commande de restauration tous lesgestionnaires de ressources, puis envoie un message dchec de la transaction lapplication.
- Si seulement des messages de succs ont t envoys, le gestionnaire de transaction envoiealors 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.
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
18/21
Dotnet France Association James RAVAILLE / Harold CUNICO
18 ADO .NET : utilisation des transactions
application
Gestionnaire
de ressources
Gestionnaire
de
transactions
Gestionnaire
de ressources
Serveur 2
Serveur 1
(1) Cration dune transaction
(2) Excution dune requte
de mise jour de donnesau sein de la transaction
(3) Envoie dune requte
de validation
(4) Commande
de prparation(5) Prparation
pour la
transaction
(4) Commande de
prparation
(5) Prparationpour la
transaction
(6) Succs de la prparation
(6) Succs de la prparation
(6') Echec de la prparation
(6') Echec de la prparation
(7) Commande de validation
(7) Commande de validation
(8) Validation
(8) Validation
Succs de validation (9)
(10) Succs de la transactionSuccs de validation (9)
(7') Commande de restauration
(7') Commande de restauration
(8') Restauration
(8') Restauration
(9') Echec de la transaction
Transaction Distribue
3.2 Mise en uvrePour 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.Transactionspermet 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 latransaction si les commandes ont bien t excutes. Dans le cas contraire, la transaction est
annule et la base de donnes retrouve son tat initial.
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
19/21
Dotnet France Association James RAVAILLE / Harold CUNICO
19 ADO .NET : utilisation des transactions
//C#string connectionString1 = "Data Source=NORBERT\\SQLEXPRESS;InitialCatalog=DotnetFrance;Integrated Security=true";string connectionString2 = "Data Source=NORBERT\\SQLEXPRESS;InitialCatalog=dnFrance;Integrated Security=true";
using (TransactionScope Transaction = newTransactionScope()){
using (SqlConnection connection1 = newSqlConnection(connectionString1)){
try{
SqlCommand commande = connection1.CreateCommand();commande.CommandText = "DELETE FROM Stagiaire WHERE nom like
'PIERRE';";connection1.Open();commande.ExecuteNonQuery();connection1.Close();
using (SqlConnection connection2 = newSqlConnection(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();}
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
20/21
Dotnet France Association James RAVAILLE / Harold CUNICO
20 ADO .NET : utilisation des transactions
// VB.netDim connectionString1 AsString = "Data Source=NORBERT\SQLEXPRESS;InitialCatalog=DotnetFrance;Integrated Security=true"Dim connectionString2 AsString = "Data Source=NORBERT\SQLEXPRESS;InitialCatalog=dnFrance;Integrated Security=true"
Using Transaction AsNew TransactionScope()
Using connection1 AsNew 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 AsNewSqlConnection(connectionString2)_
Try
Dim commande2 As SqlCommand =connection2.CreateCommand()_
commande.CommandText = "DELETE FROM ManagerWHERE nom like 'Tartonpion';"_
connection1.Open()commande.ExecuteNonQuery()connection2.Close()
Catch ex As ExceptionMessageBox.Show(ex.Message)
EndTryEndUsing
Catch ex As ExceptionMessageBox.Show(ex.Message)
EndTryEndUsingTransaction.Complete()
EndUsing
-
7/29/2019 ADO .NET - Utilisation des Transactions.pdf
21/21
21 ADO .NET : utilisation des transactions
4 ConclusionCe 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 lesproprits ACID.
- Lutilisation des transactions pour verrouiller des donnes.- Lutilisation des transactions distribues.