¿por qué mybatis funciones Insertar / Actualizar ahora requieren una confirmación después de la adición de FK a DB?

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

  •  09-10-2019
  •  | 
  •  

Pregunta

tengo un proyecto que utiliza mybatis para la persistencia. Método "A" de abajo estaba funcionando bien hasta que he añadido algunas claves externas y convertido mi tabla de MyISAM a InnoDB. Después de la conversión, el método "A" fallaría en silencio, ni siquiera una advertencia en los registros. Después de la conversión, único método "B" hace una inserción exitosa. Ambos métodos escribir el código SQL correcta de los registros, pero sólo "B" obras.

¿alguien puede llenar en sobre por qué tengo que hacer un commit ahora, pero no tiene que hacer un commit con anterioridad?

//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;
}
¿Fue útil?

Solución

myisam no es transaccional. Confirmación automática está activada por defecto (en realidad es ignorada por el controlador JDBC desde cada declaración commit). InnoDB es transaccional y confirmación automática también es desactivada por defecto. Esto significa que usted tiene que session.commit llamada () o la base de datos en realidad nunca lo hace la actualización.

Consulte este blog entrada para más información.

Tenga en cuenta que debe llamar a cometer en lugar de dejar las cosas hasta la confirmación automática. Dejando fuera de confirmación automática causará problemas con la agrupación de conexiones, ya que puede salir de declaraciones en un estado desconocido cuando se reutiliza la conexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top