为什么Mybatis插入/更新功能现在需要在将FK添加到DB之后提交?
题
我有一个使用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从未实际进行更新。
看 此博客条目 了解更多信息。
请注意,您应该致电提交,而不是让事情进行自动加入。离开自动加入会导致连接池的问题,因为它可以在连接重复使用时将语句留在未知状态下。
不隶属于 StackOverflow