我问自己,SELECT
之后LAST_INSERT_ID()
WHERE
INSERT
是否有可能在一批SELECT
之后没有获得表中的损坏数据?我正在考虑多个用户同时做同样事情的场景。我开发了一个可以实现这种情况的JSF应用程序。
在硬代码中INSERT
之后的preparedstatement.addBatch(
"INSERT INTO table1(all the FIELDS)"
+ "VALUES(null, ...);"
);
preparedstatement.addBatch(
"INSERT INTO table2(all the FIELDS)"
+ "VALUES(null, LAST_INSERT_ID(), ...);"
);
preparedstatement = connect.prepareStatement(
"SELECT id FROM table3 WHERE id = LAST_INSERT_ID();"
);
preparedstatement.executeBatch();
resultSet = preparedstatement.executeQuery();
看起来像这样:
{{1}}
让我对此实现有疑问,还是有更好的方法?
最好的问候
答案 0 :(得分:1)
你应该没问题,引用MySQL的文档:
生成的ID在服务器上维护 每个连接基础。这意味着返回的值 给定客户端的函数是生成的第一个AUTO_INCREMENT值 对于影响AUTO_INCREMENT列的最新语句 客户。此值不受其他客户端的影响,即使它们也是如此 生成自己的AUTO_INCREMENT值。此行为可确保 每个客户端都可以检索自己的ID而无需担心 其他客户的活动,无需锁或 交易。