2016-12-14 8 views
0

私はpostgresとHibernateを使用しています。私は生成されたIDで何か変わったことに気付いています。Hibernateとpostgresql bigserial - 非順列

id bigserial 

nextval('my_id_seq'::regclass)

によって支えられています:それは、シーケンス内の巨大なジャンプは、私が1524行を持つテーブルが、それでも最高のidは602778.

私のidカラムは、このように定義されている可能

my_id_seqの開始値は1で、インクリメントは1で、SquirereLを使ってnextvalを呼び出すときめ細かくインクリメントします。私のHibernateのエンティティで

は、idは次のようにマップされます。id列に、このような突然のジャンプを引き起こす可能性が

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

何(一点で、それは4152から12041にジャンプしますか)?

+1

'SERIAL' PostgreSQLの型とシーケンスはギャップを含んでいることが知られています(その世代はどのトランザクションよりも上にあるため、生成された値は決してロールバックされません)。しかし、統計的には、このような巨大なジャンプは、ロールバックされたトランザクションによって引き起こされることはありません(多くのエンティティを生成しようとする重大なバグがあっても失敗した場合に限る)。 – pozs

+0

これはテスト環境です。定期的に実行されるプロセス。十分な不具合のある項目とそれを説明するかもしれない時間がある。チェックされたプロダクションで、それほど悪くない9716行、最大IDは43083です。とにかく、失敗した試行を別のタスクの一部として修正しました。うまくいけばギャップがなくなります。 – Tobb

答えて

1

ロールバックとエラーがそれを行います。 例:チェック

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

INSERT 0 1 

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=# select * from s; 
i 
--- 
1 
2 
4 
(3 rows) 
関連する問題