我有一个使用 myBatis 进行持久化的项目。在我添加一些外键并将我的表从 myISAM 转换为 innoDB 之前,下面的方法“A”工作得很好。转换后,方法“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 不是事务性的。默认情况下自动提交是打开的(实际上它会被 JDBC 驱动程序忽略,因为每个语句都会提交)。 innoDB 是事务性的,默认情况下自动提交也是关闭的。这意味着您必须调用 session.commit() 否则数据库实际上不会进行更新。
参见 this blog entry获取更多信息。
请注意,您应该调用提交而不是将事情留给自动提交。关闭自动提交将导致连接池出现问题,因为它可能在重用连接时使语句处于未知状态。
关于java - 为什么 myBatis 插入/更新函数现在需要在将 FK 添加到数据库后提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372640/