pourquoi les fonctions d'insertion / mise à jour mybatis nécessitent maintenant un commettras après avoir ajouté FK à DB?

StackOverflow https://stackoverflow.com/questions/4372640

  •  09-10-2019
  •  | 
  •  

Question

J'ai un projet qui utilise mybatis pour la persistance. méthode « A » ci-dessous fonctionnait très bien jusqu'à ce que j'ai ajouté quelques clés étrangères et converti ma table de MyISAM à InnoDB. Après la conversion, la méthode « A » échouerait en silence, même pas un avertissement dans les journaux. Après la conversion, seule méthode « B » fait un insert avec succès. Les deux méthodes écrire le code SQL correct pour les journaux, mais seulement des œuvres « B ».

remplissage Quelqu'un peut-il me pourquoi je dois faire un commettras maintenant, mais n'a pas eu à faire un commit déjà?

//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;
}
Était-ce utile?

La solution

MyISAM est pas transactionnel. Autocommit est activé par défaut (en fait il est ignoré par le pilote JDBC depuis tous les commits de déclaration). InnoDB est transactionnel et est aussi directement désactivée par défaut. Cela signifie que vous devez appeler session.commit () ou la DB ne fait jamais réellement la mise à jour.

Voir cette entrée de blog pour plus d'informations.

Notez que vous devez appeler engager plutôt que les choses congé jusqu'à autocommit. Laissant hors autocommit cause des problèmes avec la mise en commun de connexion, car il peut laisser des déclarations dans un état inconnu lorsque la connexion est réutilisée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top