我在数据库中有一个表和一个生成器。该表有一个主键,它是一个整数。如果用户试图在表中插入记录,hibernate 会从数据库中的序列中进行选择,从而使序列自行增加。问题是,如果在提交事务时发生某些错误,序列已经增加,并且下一条要保存的记录将不会有与之前插入的最后一条记录相比序列一致的主键。
有办法解决吗?
--------编辑--------
我设法创建了一个触发器来完成这项工作:
CREATE TRIGGER TBLTESTE_BI0 FOR TBLTEST
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable next_value integer;
begin
select coalesce(max(my_sequence_field+1),1) from tbltest into :next_value;
new.my_sequence_field=:next_value;
end
我当然不会用这个作为主键,主键还是会由序列生成器生成。 但只是一个问题,是否保证 my_sequence_field 具有正确的序列,没有重复的值?考虑到该值将仅由触发器设置。
最佳答案
考虑这三个理想的属性:
- 添加新行不需要序列化以防止同时添加其他行。
- 可以在插入行时分配新的唯一标识符。
- 唯一键被分配一个严格的连续编号,没有任何间隙。
您的系统中只能有两个这些属性。如果您希望数字严格按顺序排列,则必须锁定表以进行新插入,或者在插入行后异步填充唯一值。
同样,如果您想避免序列化新行的创建,则必须推迟分配新的唯一标识符,或者不分配严格的顺序值。
第一项和第二项对于合成主键通常更为重要。如果您需要生成严格顺序的值(例如,发票编号有时必须按法律顺序排列),那么您通常会删除前两个属性之一。
关于java - 如何在数据库中生成序号序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21481193/