自增主键锁

MySQL 自增主键和UUID

妖精的绣舞 提交于 2019-12-17 13:10:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 关于自增主键和UUID的比较,可以从数据插入前,插入中,插入三个阶段进行比较,他们有各自的有点,当然也有各自的不足。下面就分三个阶段说说优缺点。 插入前 1)UUID 需要手动维护,要求是保证每次生成的数据都是不一致的,然后我们需要手写sql插入,如果代码逻辑中含有大量这种非业务相关的代码,其实是很不友好的,所以尽量透明。但是在代码中(Java)你可以在未插入之前就知道了主键ID,这个在有关联表需要插入时非常不错。 2)自增主键 插入前无需维护,编写的sql也不用管这个字段,数据库自己维护,对写程序来说完全透明。缺点就是插入前代码中(Java)并不知道主键。 插入中 1)UUID 长度相对比较大,如果大批量数据插入,在网络传输间,实际上这个字段占用的空间是不容小觑的,当然一般的程序不会担心这个,因为选用 Hibernate 的人,基本不会在乎某个字段的事。另外,既然是主键那么必然要考虑主键的唯一性,如何做这个唯一的校验呢?尤其是并发情况下,如果有多个相同的键同时插入怎么办?所以我觉得这里会有个锁(可能是锁索引,也可能是锁表),因此使用UUID并发插入肯定会发生阻塞的。这个可以去试验一下,开两个事务,使用相同的ID插入,后一个插入肯定会被阻塞,所以我觉得这里肯定有一个判断是否已经存在键的代码,而且是同步的