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

cla*_*son 1 java mysql ibatis mybatis

我有一个使用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;
}
Run Code Online (Sandbox Code Playgroud)

Ang*_*own 10

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

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

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