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

解决方案

Myisam不是交易的。默认情况下,AutoCommit已打开(实际上,JDBC驱动程序忽略了它,因为每个语句都提交)。 InnoDB是交易的,默认情况下也关闭了自动企业。这意味着您必须致电session.commit()或DB从未实际进行更新。

此博客条目 了解更多信息。

请注意,您应该致电提交,而不是让事情进行自动加入。离开自动加入会导致连接池的问题,因为它可以在连接重复使用时将语句留在未知状态下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top