Discuss / Java / 对不能先插入后查询的理由有点迷惑

对不能先插入后查询的理由有点迷惑

Topic source

原文:“要获取自增主键,不能先插入,再查询。因为两条SQL执行期间可能有别的程序也插入了同一个表。”

假设A程序插入一行数据后,该数据行的主键id为11;然后B插入一行数据后,主键id为12,这应该不影响A查询啊。

另外我觉得不能这样做的理由还有一个,表里可能存在自增主键不同、其他字段相同的数据行。

云外方天

#2 Created at ... [Delete] [Delete and Lock User]

要是同时插入两条相同的数据呢?

这里获取自增主键使用的方式应该是mysql 的select last_insert_id(),这种方式必须保证获取主键的操作要紧跟insert之后。

个人感觉教程意图是强调获取主键不能自行搜索,必须使用jdbc方式,也就是指定RETURN_GENERATED_KEYS标志位

TRUE-TAO

#4 Created at ... [Delete] [Delete and Lock User]

使用多线程循环插入,然后你在使用一个线程插入后在获取插入的自增值,你就知道为什么了,这里保证了严谨性。

你在这里肯定看不到,如果在某一个时间段,多个程序都在插入,而你插入之后在其他程序紧随其后在插入数据,然后你获取可能获取的就是别的程序插入的值,你可能会说,我查询条件是我插入的值不就可以了?假如其他程序插入的值跟你之前插入的都一样呢?在表里面,主键保证了唯一性,所以只有主键绝对是不一样的。

🌙

#5 Created at ... [Delete] [Delete and Lock User]

你是不是对查询有什么误解?

佐上楼兰

#6 Created at ... [Delete] [Delete and Lock User]

不能先插入后查询的意思是,如果你先插入,再查询,查询的时候你只能用主键来关联查询,但是问题是你当前你不知道主键是多少啊?那你怎么办?你只能是通过主键排序,获取当前主键最大值的那条数据,以此来拿到主键值。然后问题就来了,其他程序在你查询之前也插入了数据的情况下,你当前获取主键最大值的那条数据已经不是当前你插入的那条数据了。


  • 1

Reply