почему функции вставки / обновления myBatis теперь требуют фиксации после добавления FK в БД? - PullRequest
1 голос
/ 07 декабря 2010

У меня есть проект, который использует myBatis для постоянства.Метод «А», приведенный ниже, работал нормально, пока я не добавил некоторые внешние ключи и не преобразовал свою таблицу из myISAM в innoDB.После преобразования метод «А» будет молчаливо проваливаться, даже в журналах нет предупреждения.После преобразования только метод "B" делает успешную вставку.Оба метода записывают правильный sql в журналы, но работает только буква "B".

Может кто-нибудь объяснить мне, почему мне нужно сделать коммит сейчас, но ранее не нужно было делать коммит?

//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;
}

1 Ответ

10 голосов
/ 07 декабря 2010

myISAM не является транзакционным. Автокоммит включен по умолчанию (фактически он игнорируется драйвером JDBC, поскольку каждый оператор фиксируется). innoDB является транзакционным, и автокоммит также отключен по умолчанию. Это означает, что вам нужно вызвать session.commit (), иначе БД на самом деле никогда не выполнит обновление.

См. эту запись в блоге для получения дополнительной информации.

Обратите внимание, что вы должны вызывать commit, а не оставлять вещи для автоматической фиксации. Отключение автоматической фиксации приведет к проблемам с пулами соединений, поскольку при повторном использовании соединения операторы могут оставаться в неизвестном состоянии.

...