为什么myBatis插入/更新函数现在需要在将FK添加到DB后提交?

时间:2010-12-07 01:33:07

标签: java mysql mybatis ibatis

我有一个使用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;
}

1 个答案:

答案 0 :(得分:10)

myISAM不是交易性的。默认情况下,自动提交已启用(实际上,由于每个语句都提交,因此JDBC驱动程序会忽略它)。 innoDB是事务性的,默认情况下自动提交也是关闭的。这意味着你必须调用session.commit()或者数据库从不实际进行更新。

有关详细信息,请参阅this blog entry

请注意,您应该调用commit而不是将其保留为autocommit。关闭自动提交将导致连接池出现问题,因为它可能会在重用连接时将语句置于未知状态。