我有一个使用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;
}
答案 0 :(得分:10)
myISAM不是交易性的。默认情况下,自动提交已启用(实际上,由于每个语句都提交,因此JDBC驱动程序会忽略它)。 innoDB是事务性的,默认情况下自动提交也是关闭的。这意味着你必须调用session.commit()或者数据库从不实际进行更新。
有关详细信息,请参阅this blog entry。
请注意,您应该调用commit而不是将其保留为autocommit。关闭自动提交将导致连接池出现问题,因为它可能会在重用连接时将语句置于未知状态。