Константин wrote:
Вопрос: когда я, с таким подходом, напорюсь на грабли ? И на какие ?
CREATE PROCEDURE DOC_PROVODKA (
doc_id bigint)
as
declare variable i bigint;
declare variable tid bigint;
declare variable ftid bigint;
begin
// Stop - семафор,
// sleep - UDF наподобие Application.ProcessMessages в Delphi
while (gen_id(stop, 0) <> 0)) do sleep(100);
i = gen_id(stop, 1);
Здесь. Запросто можешь получить в i не 1, как ты думаешь, а 2,3...N
select TYPE_ID, to_id from vw_doc where id = :doc_id into :tid, :ftid;
select max(num) from doc where TYPE_ID = :tid into :i;
Здесь. Либо лишний индекс либо будешь курить бамбук.
update doc set num = z(:i) + 1 where id = :doc_id;
select max(UserNUM) from doc where TYPE_ID = :tid and to_id = :ftid into :i;
Здесь. Либо лишний индекс либо будешь курить бамбук.
update vw_doc set UserNUM = z(:i) + 1 where id = :doc_id;
i = gen_id(stop, -1);
Здесь. Запросто можешь получить в i не 0, как ты думаешь, а 1,2,3...N
end
А если серьёзно, кто что думает по этому поводу ?
Очередной лисапет с до боли знакомыми квадратными колёсами.
Если можно, подскажите варианты решения ... желательно опробованные на
практике ...
Раз уж тебе приспичило создавать бутылочные горлышки в системе и
выстраивать всех в очередь, заведи табличку
Номера
Тип документа not null PK
Следующий номер int
и получай номер как-нибудь так:
Starttransaction
Repeat
Try
Update Номера Set Следующий номер = Следующий номер +1
Where Тип документа = Чаво нада;
Select Следующий номер
From Номера
Where Тип документа = Чаво нада;
Получилося:=True;
Except Do
Получилося:=False;
end;
Until Получилося;
Тыр-пыр-восемь дыр, ну там инсёрт или ещё чего нада для щастья
Commit;
Это для read_commited. А ващета про генерацию "людских", а не
искуственных номеров, подробные статейки есть, и вроде даже у ДК на сайте...
--
Regards. Ded.