2010-12-07 32 views
1

J'ai un projet qui utilise myBatis pour la persistance. La méthode "A" ci-dessous fonctionnait très bien jusqu'à ce que j'ajoute quelques clés étrangères et convertis ma table de myISAM en innoDB. Après la conversion, la méthode "A" échouerait silencieusement, pas même un avertissement dans les journaux. Après la conversion, seule la méthode "B" réussit l'insertion. Les deux méthodes écrivent le sql correct dans les journaux, mais seul "B" fonctionne.Pourquoi les fonctions d'insertion/mise à jour de myBatis nécessitent-elles un commit après l'ajout de FK à DB?

Quelqu'un peut-il me renseigner sur pourquoi je dois faire un commit maintenant, mais je n'ai pas eu à faire un commit auparavant?

//doesnt work, but worked previously 
public void A(Role role) { 
    SqlSession session = sqlSessionFactory.openSession(); 
    try { 
     RoleMapper mapper = session.getMapper(RoleMapper.class); 
     mapper.updateByPrimaryKeySelective(role); 
    }catch(Exception e){ 
     logger.error(e); 
    } finally { 
     session.close(); 
    } 
    return; 
} 

//works correctly, but why? 
public void B(Role role) { 
    SqlSession session = sqlSessionFactory.openSession(); 
    try { 
     RoleMapper mapper = session.getMapper(RoleMapper.class); 
     mapper.updateByPrimaryKeySelective(role); 
     session.commit(); 
    }catch(Exception e){ 
     logger.error(e); 
    } finally { 
     session.close(); 
    } 
    return; 
} 

Répondre

10

myISAM n'est pas transactionnel. Autocommit est activé par défaut (en fait, il est ignoré par le pilote JDBC car chaque instruction est validée). innoDB est transactionnel et autocommit est également désactivé par défaut. Cela signifie que vous devez appeler session.commit() ou que la base de données n'effectue jamais la mise à jour. Pour plus d'informations, voir this blog entry pour plus d'informations.

Notez que vous devez appeler valider plutôt que de laisser les choses s'exécuter en autocommit. Laisser l'autocommit désactivé provoquera des problèmes de regroupement de connexions car il peut laisser des instructions dans un état inconnu lorsque la connexion est réutilisée.

+0

Je n'étais pas au courant de la différence transactionnelle entre myisam et innodb, merci pour cette petite friandise. – clarson

+0

@AngerClown Merci pour votre message. Vous avez été si utile. – hiropon