IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres SGBD Discussion :

Verouillage dans HSQL


Sujet :

Autres SGBD

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut Verouillage dans HSQL
    Bonjour tous le monde,
    je cherche depuis plusieurs jours comment verrouillé une table dans HSQL .
    c'est pas la même syntaxe que SQL .
    j'ai utilisé la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOCK TABLE MaTable Read
    mais sa ne marche pas.

    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public static void  main(String[] args) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException, SAXException, IOException, ParserConfigurationException
    {
     ResultSet resultat = connexion("SELECT nom FROM Banque WHERE num_compte = 1987 " );
     if(resultat.next())
     {
      String nom=resultat.getString("nom" );
      System.out.println(nom);
     }
     resultat=connexion("LOCK TABLE Banque Read" );
     resultat = connexion("SELECT nom FROM Banque WHERE num_compte = 1987 " );
     if(resultat.next())
     {
      String nom=resultat.getString("nom" );
      System.out.println(nom);
     }
     else
      System.out.println("Lock" );
    }
    //======================================================
    public static ResultSet connexion( String requete)
    {
     ResultSet resultat=null;
     try
     {
      System.out.println(requete);
      Class.forName("org.hsqldb.jdbcDriver" ).newInstance();
      Connection connexion = DriverManager.getConnection("jdbc:hsqldb:file:C:\\mydatabases\\BDD_Banque", "sa", "" );
      Statement st = connexion.createStatement();
      resultat = st.executeQuery(requete);
      //Sauvegarde et fermeture de la connexion:
      st.executeQuery("SHUTDOWN" );
      st.close();
      connexion.close() ;
     }catch (Exception ex1) {
      System.out.println("Exeption >>>>> connexion()" );
                ex1.printStackTrace();
     }
     return resultat;
    }

    voila ce qui est écrie dans la FAQ HSQL


    LOCK TABLE

    lock table statement

    <lock table statement> ::= LOCK TABLE <table name> { READ | WRITE} [, <table name> { READ | WRITE} ...]}

    In some circumstances, where multiple simultaneous transactions are in progress, it may be necessary to ensure a transaction consisting of several statements is completed, without being terminated due to possible deadlock. When this statement is executed, it waits until it can obtain all the listed locks, then returns. The SQL statements following this statements use the locks already obtained (and obtain new locks if necessary) and can proceed without waiting. All the locks are released when a COMMIT or ROLLBACK statement is issued. Currently, this command does not have any effect when the database transaction control model is MVCC.

    Example 3.3. Locking Tables

    LOCK TABLE table_a WRITE, table_b READ



    merci pour votre aide c'est très urgent.

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Qu'est-ce qui ne marche pas ?

    Ca va être difficile de vous aider, si on ne sait même pas ce qui ne fonctionne pas.

    Ce serait aussi pas mal de donner un code en Java... Parce que IF et RETURN n'existent pas...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Qu'est-ce qui ne marche pas ?
    je m'explique :
    quand je lance la première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     ResultSet resultat = connexion("SELECT nom FROM Banque WHERE num_compte = 1987 " );
     if(resultat.next())
     {
      String nom=resultat.getString("nom" );
      System.out.println(nom);
     }
    le résultat s'affiche.

    puis j'ai fais un Lock sur Read et j'ai ré exécute le même code ( c a d un autre lecture ).

    il m'affiche cette erreur au niveau de l'instruction LOCK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.sql.SQLException: Unexpected token: LOCK in statement [LOCK]
    	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    	at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
    	at org.hsqldb.jdbc.jdbcStatement.executeQuery(Unknown Source)
    	at Essaye2.connexion(Essaye2.java:86)
    	at Essaye2.main(Essaye2.java:59)
    et il continu a exécuter la deuxiéme lecture, alors que normalement NON puisque j'ai fais un Lock sur la lecture.

    Citation Envoyé par Baptiste Wicht Voir le message
    Ce serait aussi pas mal de donner un code en Java... Parce que IF et RETURN n'existent pas...
    je ne sais pas pourquoi il a affiché en majuscule.

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Et si tu utilises un executeUpdate() pour le lock ?

    En plus, tu devrais ne créer la connexion à la base de données qu'une seule fois et l'utilser plusieurs fois. A moins que ce ne soit voulu pour des tests.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    même chose avec executeUpdate .

    effectivement, je fais appel a la connexion de la BDD chaque fois c'est juste pour tester.
    je crois que comme sa c 'est plus propre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    try
        {
    		Class.forName("org.hsqldb.jdbcDriver").newInstance();
    		Connection connexion = DriverManager.getConnection("jdbc:hsqldb:file:C:\\mydatabases\\BDD_Banque", "sa", "");
    		Statement st = connexion.createStatement();
     
    		ResultSet resultat = st.executeQuery("SELECT nom FROM Banque WHERE num_compte = 1987 ");
     
    		if(resultat.next())
    		{
    			String nom=resultat.getString("nom");
    			System.out.println(nom);
    		}
     
    		//------------------------------
    		st.executeUpdate("LOCK Table Banque Read");
     
    		//------------------------------------------
     
    		resultat = st.executeQuery("SELECT nom FROM Banque WHERE num_compte = 1987 ");
     
    		if(resultat.next())
    		{
    			String nom=resultat.getString("nom");
    			System.out.println(nom);
    		}
    		else 
    			System.out.println("Lock");
     
    		//deconnexion
     
    		//Sauvegarde et fermeture de la connexion:
    		st.executeQuery("SHUTDOWN");
    		st.close();
    		connexion.close() ;
    	}
        catch (Exception ex1) 
        {
    		System.out.println("Exeption >>>>> connexion()");
            ex1.printStackTrace();
    	}
    mais sa ne marche pas toujours la même erreur

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Salut,

    En fait, même quand j'essaye une requête "LOCK TABLE maTable Read" directement dans HSQLDB Manager ça ne s'execute pas, j'ai la même erreur: Unexpected token: LOCK IN statement [LOCK] ...

    LOCK n'est elle pas une instruction SQL qui devrait être reconnu par HSQLBD ? Je ne vois pas où est le problème.

Discussions similaires

  1. Comment inclure ma BDD hsql dans mon fichier .jar ?
    Par sider dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 06/02/2011, 22h37
  2. remplir un champs dans HSQL avec un String saisi
    Par lampoulchon dans le forum JDBC
    Réponses: 3
    Dernier message: 01/02/2008, 19h30
  3. pb Hibernate-HSQL parenthèse dans condition Where
    Par quisera dans le forum Hibernate
    Réponses: 3
    Dernier message: 02/04/2007, 10h11
  4. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39
  5. Documentation DirectX dans C++Builder 3
    Par srvremi dans le forum DirectX
    Réponses: 1
    Dernier message: 26/04/2002, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo