java - 当自动提交设置为 false 时,select 是否返回最后插入的行?

标签 java mysql autocommit

假设我有一个名为 users 的表和一个名为 username 的列,其格式为 user1 ,用户2 ..

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

因为在 AutoCommit 设置为 false 时,插入后可以在 JDBC API 中getGenerateKeys

在如下情况下:

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 查询是否返回最后插入的值 或者 它返回表中之前我开始循环的最大列?

最佳答案

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

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

TL:DR 不,不要这样做!

关于java - 当自动提交设置为 false 时,select 是否返回最后插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520213/

相关文章:

sql-server - 如何在 SQL Server session 中设置自动提交?

java - JOOQ生成的pojo缺少GenerateValue注释

java - Tomcat 7.x 和在 JDK 1.5 上编译的代码

javascript - 如何修复使用 Sequelize Node Express Mysql 插入数据库的问题?

php - 如何在mysql中使用存储过程获取问题及其相关标签?

java - 出错后如何执行RollBack?

Java类的继承

java - Java:使用按钮停止声音播放

mysql - 如何使用 Google Container Engine 与 Google Cloud SQL 连接?

python - Flask-MySQLdb 自动提交?