Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当自动提交设置为false时,select是否返回上次插入的行?_Java_Mysql_Autocommit - Fatal编程技术网

Java 当自动提交设置为false时,select是否返回上次插入的行?

Java 当自动提交设置为false时,select是否返回上次插入的行?,java,mysql,autocommit,Java,Mysql,Autocommit,假设我有一个名为users的表和一个名为username的列,格式为user1,user2 我想在循环中将用户插入到这个表中,每个条目的值取决于用户的前一个。新条目的值由表中按字母顺序排列的最大条目(即用户)生成 因为在JDBCAPI中,插入后可以getGeneratedKeys,而AutoCommit设置为false 在如下所示的情况下: connection.setAutoCommit(false); while(someCondition) { ResultSet rs = con

假设我有一个名为users的表和一个名为username的列,格式为user1,user2

我想在循环中将用户插入到这个表中,每个条目的值取决于用户的前一个。新条目的值由表中按字母顺序排列的最大条目(即用户)生成

因为在JDBCAPI中,插入后可以
getGeneratedKeys
,而AutoCommit设置为false

在如下所示的情况下:

connection.setAutoCommit(false);
while(someCondition)
{
    ResultSet rs = connection.createStatement("select max(username) from users").executeQuery();
    if(rs.next())
    { 
        name= rs.getString("username"); //returns user1
    }
    String newName = generateNewName(name); // simply makes user1 -> user2

    connection.createStatement("insert into users (name,...) values ("+newName+",...)").executeUpdate(); ///and inserts..
}
select查询是否返回上次插入的值 或
它首先返回表中的max列,然后再开始循环?

以确保您立即看到数据库上的所有更改。首选TransactionIsolation of READ_Uncommitted,而不是使用auto commit。或者,在任何地方使用自动提交也可以完成这项工作

一旦确保立即看到每个db更改,数据库将在执行selects期间的某个时间向您发送最大用户数。但一旦您实际收到结果,可能会有其他线程创建的其他用户。因此,这将只适用于单线程工作,并且很可能在当今没有任何意义

TL:DR
不,不要这样做

它将返回当前的最大值。但是,不同的会话(=不同的连接,例如不同的用户/应用)可能会看到旧值,直到您提交这些值为止,因此这仅在单用户环境中使用是安全的。还要注意
user2>user10
,因为它是按字母顺序排列的,所以您可能会得到与预期不同的最大值。@Solarflare感谢您的回复。如果你可以添加任何文件参考,并使其成为一个答案,我会接受它。顺便说一句,用户示例只是一个类比,与我实际尝试实现的目标类似,不过感谢您的警告。感谢您的回复,正如我在上面评论的那样,我建议的场景只是一个类比,显然没有反映我手上的情况。我问这个问题的原因是,我无法找到任何有关情况的记录行为,因此不是我期望的答案。但是,关于多线程方法,我不知道会有这样的风险,所以我很感谢您提供的信息。