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

标签 java mysql mybatis ibatis

我有一个使用 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/

相关文章:

java - 从 servlet 输出图像文件

mysql - 如何从phpmyadmin中的数据库中的特定表中导出特定列

java - 如何在 myBatis 的查询中使用 IN()

java - ($Proxy6) org.postgresql.jdbc4.Jdbc4Connection@5894585b,这是什么意思?

java - 如何使用 MyBatis 从 SQL 调用存储过程

java - Java 中的转义非拉丁字符

java - 在 swing 问题中编写 GUI

java - JSObject.equals() 表示 JSObject.getWindow() 不等于 JSObject.getWindow()

mysql - 中间函数/查询奇数和偶数字符串

mysql - 什么时候需要注意 SQL 查询中的 NULL 值?