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

MS SQL Server Discussion :

JDBC : Le serveur n'a pas pu reprendre la transaction


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut JDBC : Le serveur n'a pas pu reprendre la transaction
    Bonjour a tous.
    J'ai un petit problème avec SQL server 2005.

    Nous utilisons en version de test de notre application un SQL Server 2000 pour lequel le code ne génère aucune erreur.
    Mais lorsque l'on passe un production, le serveur est un SQL server 2005 et la le code genère une erreur identique à deux endroits.

    Voici l'erreur :
    com.microsoft.sqlserver.jdbc.SQLServerException: Le serveur n'a pas pu reprendre la transaction, desc. : 3d000000cf.

    le numero change en fonction de l'endroit

    com.microsoft.sqlserver.jdbc.SQLServerException: Le serveur n'a pas pu reprendre la transaction, desc. : 4600000002.

    Donc, est ce que le code SQL change entre les deux versions du serveur?

    Voici un des codes :
    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
    public static void deleteTarifs(int periode_id, Vector<String> chainIds, int mode_occupation_id, Collection<Tarif> tarifs)
    			throws SQLException {
    		Connection conn = null;
    		CallableStatement stDelete = null;
    		try {
    			conn = DBAccess.connectDB();
    			stDelete = conn
    					.prepareCall("{call dbo.PLOG_DELETE_GROUPE_TARIFS(?,?,?,?)}");
    			for (String buffer : chainIds) {
    				for (Tarif t : tarifs) {
    					if (t.getMontant() != -1) {
    						stDelete.setString(1, buffer);
    						stDelete.setInt(2, periode_id);
    						stDelete.setInt(3, mode_occupation_id);
    						stDelete.setInt(4, t.getId());
    						stDelete.execute();						
    					}
    				}
     
    			}
    			stDelete.close();
    		} catch (ClassNotFoundException e) { // TODO Auto-generated
    			e.printStackTrace();
    		} finally {
    			if (conn != null && !conn.isClosed())
    				conn.close();
    		}
     
    	}
    Je continue de mon coté les recherches.

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 820
    Points : 52 888
    Points
    52 888
    Billets dans le blog
    5
    Par défaut
    Quel est le niveau d'isolation de votre session ?

    Quel est le code de votre PS ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Le niveau d'isolation c'est celui par defaut.

    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
     
    CREATE PROCEDURE [dbo].[PLOG_DELETE_GROUPE_TARIFS] 
       @logement_ids          TEXT,
       @periode_id          INT,
       @mode_occupation_id INT,
       @tarif_id INT
    AS
    DECLARE @id_asso_logt_per INT
    DECLARE @sep CHAR
    SET @sep = char(59)
     
    DECLARE @log_ids TABLE(ID INT)
     
    BEGIN TRAN T1
     
    INSERT @log_ids  SELECT Items FROM dbo.SPLIT(@logement_ids,@sep)
     
    DECLARE elements_cursor CURSOR FOR    
       SELECT id FROM TLOG_ASSO_ETA_PER WHERE periode_id = @periode_id AND logement_id IN (SELECT ID FROM @log_ids)
     
     
    OPEN elements_cursor
    FETCH NEXT FROM elements_cursor INTO @id_asso_logt_per
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
    	DELETE FROM TLOG_ASSO_TARIF_MODE_OCCUPATION 
    	WHERE id_asso_logt_per  = @id_asso_logt_per
    	AND id_mode_occupation = @mode_occupation_id
    	AND id_tarif = @tarif_id
     
    	FETCH NEXT FROM elements_cursor INTO @id_asso_logt_per
    END
    CLOSE elements_cursor
    DEALLOCATE elements_cursor
     
    COMMIT TRAN T1
    GO
    d'apres ce topic, et si bien compris, lorsqu'une erreur de type 16 ou plus intervient, il lance une exception et fait un rollback, ce qui expliquerai aussi pourquoi les donnees ne sont pas sauvegardées.
    Tandis que dans les anciens drivers (genre SQL server 2000?), il masquait l'exception, et donc pas de rollback.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 820
    Points : 52 888
    Points
    52 888
    Billets dans le blog
    5
    Par défaut
    Votre proc est syntaxiquement incorrecte au niveau de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM TLOG_ASSO_ETA_PER WHERE periode_id = @periode_id AND logement_id IN (SELECT ID FROM @log_ids)
    En effet un nom de table ne peut être paramétré... (@log_ids)

    Votre procédure se résume en fait à deux requêtes sans curseur (et il vaut mieux) de la façon suivante :

    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
    CREATE PROCEDURE [dbo].[PLOG_DELETE_GROUPE_TARIFS] 
       @logement_ids          TEXT,
       @periode_id          INT,
       @mode_occupation_id INT,
       @tarif_id INT
    AS
    DECLARE @id_asso_logt_per INT
    DECLARE @sep CHAR
    SET @sep = char(59)
     
    DECLARE @log_ids TABLE(ID INT)
     
    BEGIN TRAN T1
     
    INSERT INTO @log_ids  
    SELECT Items 
    FROM   dbo.SPLIT(@logement_ids, @sep)
    IF @@ERROR <> 0 GOTO LBL_ERROR
     
    DELETE FROM TLOG_ASSO_TARIF_MODE_OCCUPATION 
    WHERE  id_asso_logt_per  = (SELECT id 
                                FROM   TLOG_ASSO_ETA_PER T
                                       INNER JOIN 
                                WHERE  periode_id = @periode_id 
                                  AND  logement_id IN (SELECT ID 
                                                       FROM ???))
      AND  id_mode_occupation = @mode_occupation_id
      AND  id_tarif = @tarif_id
    IF @@ERROR <> 0 GOTO LBL_ERROR
     
    COMMIT TRAN T1
     
    RETURN
     
    LBL_ERROR:
     
    ROLLBACK TRAN T1
     
    GO
    Ou ??? doit être remplacé par le nom de la table.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Merci pour la réponse,

    cependant, je pense avoir trouvé le problème.
    Les drivers n'étaient tout simplement pas à jour.

    En ce qui concerne la table paramétrée, la fonction ne venant pas de moi, je vais essayé de comprendre ta critique.

    Tu dis qu'on ne peux pas faire ca, mais apparemment la table est créée temporairement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @log_ids TABLE(ID INT)
    Merci du coup de main!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bon, apparement, le changement de driver ne suffisait pas.
    On a ajoute des setAutcommit("false") et des commit manuel dans le code java, le problème a l'air réglé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PB ODBC] Ce serveur n'existe pas ou son accès est refusé
    Par meufeu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/12/2015, 18h02
  2. Serveur NAS (physique pas un PC configuré comme NAS ! )
    Par bster dans le forum Administration système
    Réponses: 1
    Dernier message: 17/03/2006, 11h30
  3. [JDBC et les jar] Fluide, pas fluide...
    Par lmarin dans le forum JDBC
    Réponses: 6
    Dernier message: 24/02/2006, 16h24
  4. Réponses: 4
    Dernier message: 04/07/2005, 09h36
  5. Serveur dédié ou pas ??
    Par R3iTt0R dans le forum Serveurs (Apache, IIS,...)
    Réponses: 3
    Dernier message: 16/07/2004, 11h29

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