2

我有一个使用 myBatis 进行持久化的项目。下面的方法“A”工作得很好,直到我添加了一些外键并将我的表从 myISAM 转换为 innoDB。转换后,方法“A”将静默失败,日志中甚至没有警告。转换后,只有方法“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;
}
4

1 回答 1

11

myISAM 不是事务性的。默认情况下自动提交是打开的(实际上它被 JDBC 驱动程序忽略了,因为每个语句都提交了)。innoDB 是事务性的,默认情况下自动提交也是关闭的。这意味着您必须调用 session.commit() 否则数据库实际上不会进行更新。

有关更多信息,请参阅此博客条目

请注意,您应该调用 commit 而不是将事情留给自动提交。关闭自动提交将导致连接池出现问题,因为当连接被重用时,它会使语句处于未知状态。

于 2010-12-07T02:44:36.357 回答