2016-12-14 56 views
0

我使用postgres和休眠,我注意到我的生成的id奇怪的东西。这使得巨大的跳跃序列中,我有一个表1524行,最高尚的ID为602778.休眠和postgresql bigserial - 非顺序

我的id列的定义是这样的:

id bigserial 

,并通过nextval('my_id_seq'::regclass)

支持

my_id_seq的起始值为1并且增量为1,并且在通过SQuirreL调用nextval时会很好地递增。

在我的Hibernate的实体,标识映射是这样的:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

什么会导致在ID序列,突然跳跃(在一个点从4152跳到12041)?

+1

'SERIAL' PostgreSQL中的类型和序列已知包含缺口(由于他们的世代高于任何事务 - 所以生成的值永远不会回滚)。但统计上,这种巨大的跳转不能由回滚事务引起(只有当您的应用程序有一些严重的错误,它试图产生许多实体但失败 - 但我认为这是不太可能的) – pozs

+0

这是在一个测试环境中,一个定期运行的进程。有足够的失败项目和一些时间可以解释它。检查生产,并没有那么糟糕,9716行,最大ID是43083.无论如何,我已经修复了导致尝试失败的事情作为另一项任务的一部分,希望不会有更多的差距。 – Tobb

回答

1

回滚和erros会做到这一点。 如:

t=# create table s(i serial); 
CREATE TABLE 
t=# insert into s values (DEFAULT); 
INSERT 0 1 
t=# insert into s values (DEFAULT) returning i;; 
i 
--- 
2 
(1 row) 

INSERT 0 1 

现在开始交易:使用

t=# begin; 
BEGIN 
t=# insert into s values (DEFAULT) returning i; 
i 
--- 
3 
(1 row) 

INSERT 0 1 
t=# rollback; 
ROLLBACK 

值3,和现在有一个缺口:

t=# insert into s values (DEFAULT) returning i; 
i 
--- 
4 
(1 row) 

INSERT 0 1 

检查:

t=# select * from s; 
i 
--- 
1 
2 
4 
(3 rows)