Re[11]: Транзакции в Oracle
От: Аноним  
Дата: 24.02.05 11:03
Оценка:
K>Сиквенс там в принципе нельзя использовать, т.к. значения генеряться не попорядку, а хаотично:
за счет этого "хаоса" и маштабируемость, а вот чтоб по порядку вы выстраиваете все транзакции в очередь.


K>
K>select NVL((select lit.itemid
K>                         from LookupItemTranslation lit
K>                           where lit.tableid = pTableID
K>                       ), 0)
K>            into lcurrItemID
K>     from dual;
     
K>    if lcurrItemID = 0
K>         then lItemID := 1;
K>    else lItemID := lcurrItemID+1;
K>    end if;
K>


просто добавте
select lit.itemid from LookupItemTranslation lit where lit.tableid = pTableID for update wait 5;
в начало и все транзакции выстроятся в очередь.
Re[10]: Транзакции в Oracle
От: kallisto Украина  
Дата: 24.02.05 12:04
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Так в чем же проблема наконец?


W>A и B это суррогатные ключи или нет? Если B зависит от A, то причем тут sequence?


Суть проблемы заключается вот в чём: вставка в эту таблицу происходит постоянно, причём не в определённой последовательности, а хаотично. Из-за этого существует высокая вероятность возникновения такого события — сессия S1 читает данные о колонке В из таблицы lit, т.е. temp := current(lit.B for in(A)), далее выполняется анализ переменной temp --> new(temp), в это время другая сессия S2 также получает temp := current(lit.B for in(A)) и new(temp) (т.е. S1.temp = S2.temp, а соответственно и new(S1.temp) = (newS2.temp)). После чего одна из сессий делает вставку --> данные хранящиеся в другой сессии уже устаревшие и при попытке вставки, генерится исключение
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
__________________________
Жизнь — это гармония Ян и Инь
Re[11]: Транзакции в Oracle
От: wildwind Россия  
Дата: 24.02.05 13:10
Оценка:
Здравствуйте, kallisto, Вы писали:

Так и не ясно, B суррогатный ключ или нет, но похоже что суррогатный.

Смысл выражений temp := current(lit.B for in(A)) и temp --> new(temp) для меня весьма туманен, но из того что я понял, могу сделать вывод, что генерация значений для B из последовательности решит вашу проблему. B будет уникальным ключом, а (A, B) — тем более. К тому же B в таком случае можно сделать PK.
Re[11]: Транзакции в Oracle
От: wildwind Россия  
Дата: 24.02.05 13:15
Оценка:
Здравствуйте, kallisto, Вы писали:

K>
K>select NVL((select lit.itemid
K>                         from LookupItemTranslation lit
K>                           where lit.tableid = pTableID
K>                       ), 0)
K>            into lcurrItemID
K>     from dual;
K>     
K>    if lcurrItemID = 0
K>         then lItemID := 1;
K>    else lItemID := lcurrItemID+1;
K>    end if;

Это пожалуй достойно медали "За ясность мысли и лаконичность"
Re[12]: Транзакции в Oracle
От: kallisto Украина  
Дата: 24.02.05 13:21
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Так и не ясно, B суррогатный ключ или нет, но похоже что суррогатный.


CREATE TABLE SUN.LOOKUPITEMTRANSLATION
(
  TABLEID  NUMBER(4)                            NOT NULL,
  ITEMID   NUMBER(3)                            NOT NULL,
  TEXT     VARCHAR2(30 BYTE)                    NOT NULL
)

CREATE UNIQUE INDEX SUN.UQ_TABLEITEM ON SUN.LOOKUPITEMTRANSLATION
(TABLEID, ITEMID)
LOGGING
TABLESPACE ...

ALTER TABLE SUN.LOOKUPITEMTRANSLATION ADD (
  CONSTRAINT UQ_TABLEITEM UNIQUE (TABLEID, ITEMID)
    USING INDEX 
    TABLESPACE ...

ALTER TABLE SUN.LOOKUPITEMTRANSLATION ADD (
  CONSTRAINT FK_TABLEID FOREIGN KEY (TABLEID) 
    REFERENCES SUN.LOOKUPITEM (TABLEID)
    ON DELETE CASCADE)
/


W>Смысл выражений temp := current(lit.B for in(A)) и temp --> new(temp) для меня весьма туманен, но из того что я понял, могу сделать вывод, что генерация значений для B из последовательности решит вашу проблему. B будет уникальным ключом, а (A, B) — тем более. К тому же B в таком случае можно сделать PK.


Сам по себе ключ В не уникален, он уникален в комплексе с ключём А. Если использовать последовательность, то её значение с какой-то переодичностью придёться сбрасывать, ведь нумерация идёт не по порядку. И как потом последовательность будет возвращать, например число 5, если последнее значение, которое она сохранила, было 12?
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
__________________________
Жизнь — это гармония Ян и Инь
Re[13]: Транзакции в Oracle
От: wildwind Россия  
Дата: 24.02.05 13:55
Оценка: 1 (1) +1
Здравствуйте, kallisto, Вы писали:

K>Здравствуйте, wildwind, Вы писали:


W>>Так и не ясно, B суррогатный ключ или нет, но похоже что суррогатный.

K>
K>CREATE TABLE SUN.LOOKUPITEMTRANSLATION
K>...

Может быть вы не знаете, что значит суррогатный ключ?


K>Сам по себе ключ В не уникален, он уникален в комплексе с ключём А. Если использовать последовательность, то её значение с какой-то переодичностью придёться сбрасывать, ведь нумерация идёт не по порядку.


Давайте попробуем по-другому. Используя последовательность, вы получите такие значения
A    B
-----------
1    1
1    2
1    3
1    4
2    5
2    6
2    7
3    8
4    9
4    10
...

B уникален в комплексе с A, равно как и без A. Это вас устроит?
Re[14]: Транзакции в Oracle
От: kallisto Украина  
Дата: 24.02.05 14:22
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Давайте попробуем по-другому. Используя последовательность, вы получите такие значения

W>
W>A    B
W>-----------
W>1    1
W>1    2
W>1    3
W>1    4
W>2    5
W>2    6
W>2    7
W>3    8
W>4    9
W>4    10
W>...
W>

W>B уникален в комплексе с A, равно как и без A. Это вас устроит?

Оба ключа являются суррогатными, а вот по поводу предложенного Вами способа стоит ещё поразмыслить, при таком раскладе, нарушется логика, хотя ...
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
__________________________
Жизнь — это гармония Ян и Инь
Re[15]: Транзакции в Oracle
От: wildwind Россия  
Дата: 24.02.05 14:29
Оценка:
Здравствуйте, kallisto, Вы писали:

K>при таком раскладе, нарушется логика, хотя ...


Если ключи суррогатные, нарушаться нечему. Сделав B уникальным, получите из него простой PK, это лучше чем составной.
Re[16]: Транзакции в Oracle
От: kallisto Украина  
Дата: 24.02.05 14:49
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Если ключи суррогатные, нарушаться нечему. Сделав B уникальным, получите из него простой PK, это лучше чем составной.


Изначально предполагалось, что В в пределах одного значения А, будет нумероваться заново, например
[sql]
Зверь
--------------
ID_An| Title
--------------
1 | Заяц
2 | Лиса

/*--------------*/

Порода
----------------------
ID_An|ID_Аamily| Title
----------------------
1 | 1 | русак
1 | 2 | беляк
1 | 3 | толай
-----------------------
2 | 1 | афганская
2 | 2 | большеухая
2 | 3 | карликовая
2 | 4 | серая

[sql]
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
__________________________
Жизнь — это гармония Ян и Инь
Re[17]: Транзакции в Oracle
От: wildwind Россия  
Дата: 24.02.05 14:52
Оценка: 7 (2)
Здравствуйте, kallisto, Вы писали:

K>Здравствуйте, wildwind, Вы писали:


W>>Если ключи суррогатные, нарушаться нечему. Сделав B уникальным, получите из него простой PK, это лучше чем составной.


K>Изначально предполагалось, что В в пределах одного значения А, будет нумероваться заново, например


Зачем? Клиент/начальство захотели красивые номера?
Re[18]: Транзакции в Oracle
От: kallisto Украина  
Дата: 24.02.05 15:03
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Зачем? Клиент/начальство захотели красивые номера?


Да, но красивую нумерацию им можно обеспечить в самом приложении, не привязываясь к колонке В, т.е. считывать все данные дла опр-го А, а потом, перебирая их, делать "красивую" нумерацию... Наверно, так и сделаю. Спасибо
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
__________________________
Жизнь — это гармония Ян и Инь
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.