Firebird 2.1中GEN_OP2生成器调用GEN_ID(,1)增量非1问题咨询
Firebird生成器GEN_OP2增量异常排查方案
问题背景
调用GEN_ID(GEN_OP2, 1)时,生成器增量偶尔不为1(例如直接从x跳到x+3或x+6),但同存储过程中调用的GEN_OP1增量始终正常。存储过程核心代码如下:
create procedure insert_proc ( Type integer) returns ( Op1 integer, Op2 integer) as begin if (:Type = 0) then begin Op1 = GEN_ID(GEN_OP1, 1); Op2 = GEN_ID(GEN_OP2, 1); END Insert Into Table1(Op1, Op2) VALUES(:Op1, :Op2); end
排查方向
确认GEN_OP2的调用范围
务必核实是否有其他代码(存储过程、触发器、应用程序)直接调用GEN_ID(GEN_OP2, N)且N≠1。可以用Firebird跟踪工具捕获所有针对GEN_OP2的操作,排查是否存在异常调用。事务回滚的影响
Firebird生成器是非事务性的,调用GEN_ID后值会永久递增,即使后续事务回滚。如果存在调用存储过程后回滚的场景,未提交的生成器值会丢失导致序列断层。需要对比GEN_OP1和GEN_OP2对应的事务回滚频率,看是否GEN_OP2相关操作回滚次数更多。生成器缓存配置
检查GEN_OP2的缓存设置:SELECT RDB$GENERATOR_CACHE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = 'GEN_OP2';如果缓存值大于1,Firebird会一次性为连接缓存多个生成器值,连接断开时未使用的缓存值会丢失,造成序列跳变。可以执行以下语句将缓存改为1:
ALTER GENERATOR GEN_OP2 SET CACHE 1;Firebird版本兼容性
若使用的是2.5及更早版本,可能存在生成器相关的已知bug,建议升级到3.0或4.0的最新稳定补丁版本测试。触发器与表操作干扰
检查Table1上的触发器,确认是否在插入时额外调用了GEN_OP2,比如触发器中误执行了GEN_ID(GEN_OP2, 1)或更大增量的操作。
内容的提问来源于stack exchange,提问作者user975502
相关产品推荐
相关产品推荐

