ADO .NET - Utilisation des Transactions.pdf

download ADO .NET - Utilisation des Transactions.pdf

of 21

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.