2016-12-14 77 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)