Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Триггеры... Поделитесь опытом / 25 сообщений из 38, страница 1 из 2
01.02.2007, 21:51
    #34300512
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Необходимо при изменении данных в таблице автоматически обновлялись данные в других таблицах... Лучше делать все в одном триггере или разбивать на несколько? Поделитесь опытом....
...
Рейтинг: 0 / 0
02.02.2007, 10:05
    #34301106
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Триггеры никогда не могут быть UR???? Это ведь на самом деле так?
...
Рейтинг: 0 / 0
02.02.2007, 10:13
    #34301136
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Как найти для процедуры пакет?
...
Рейтинг: 0 / 0
02.02.2007, 11:19
    #34301424
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
TORTНеобходимо при изменении данных в таблице автоматически обновлялись данные в других таблицах... Лучше делать все в одном триггере или разбивать на несколько? Поделитесь опытом....Все равно.
TORTТриггеры никогда не могут быть UR???? Это ведь на самом деле так?Триггеры наследуют уровень изоляции вызывающего приложения.
Если надо его менять по ходу выполнения - используйте вызов процедуры из триггера.
TORTКак найти для процедуры пакет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
R.ROUTINESCHEMA, R.ROUTINENAME,
P.PKGSCHEMA, P.PKGNAME
, d.btype
FROM SYSCAT.ROUTINES R 
JOIN SYSCAT.ROUTINEDEP D 
ON  R.ROUTINESCHEMA = D.ROUTINESCHEMA
AND R.SPECIFICNAME  = D.ROUTINENAME 
JOIN SYSCAT.PACKAGES P
ON  D.BSCHEMA = P.PKGSCHEMA
AND D.BNAME   = P.PKGNAME;
...
Рейтинг: 0 / 0
02.02.2007, 11:19
    #34301426
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Если есть 2 триггера на одинаковое событие, допустим after update... Какой триггер срабатывает первым?
В триггере использую оператор merge, так вот он вызывает блокировку всей таблицы, которую обновляю через merge... Возникают постоянные блокировки... Чего-то никак не могу разрулить....
Кто подскажет выход?
...
Рейтинг: 0 / 0
02.02.2007, 11:22
    #34301446
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
To Mark:
спасибо за информацию....
...
Рейтинг: 0 / 0
02.02.2007, 11:26
    #34301474
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
TORTЕсли есть 2 триггера на одинаковое событие, допустим after update... Какой триггер срабатывает первым?Тот, который первым создан.
TORTВ триггере использую оператор merge, так вот он вызывает блокировку всей таблицы, которую обновляю через merge... Возникают постоянные блокировки... Чего-то никак не могу разрулить....
Кто подскажет выход?Покажите этот merge и ddl таблиц с индексами, которые там участвуют.
...
Рейтинг: 0 / 0
02.02.2007, 11:40
    #34301557
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Вот триггер:

CREATE TRIGGER DB2ADMIN.CHK_SALDO2
AFTER DELETE
ON DB2ADMIN.PROVOD REFERENCING OLD_TABLE as old
FOR EACH STATEMENT MODE DB2SQL
BEGIN atomic
merge into DB2ADMIN.saldo as a
using (select podrazd_id, debet_id, debet_partner_id, debet_analitika_id, sum(summa) as summa
from old group by podrazd_id, debet_id, debet_partner_id, debet_analitika_id) as b
on a.podrazd_id = b.podrazd_id
and a.subcount_id = b.debet_id
and a.partner_id = b.debet_partner_id
and a.analitika_id = b.debet_analitika_id
when matched then update set summa_debet = summa_debet - b.summa;

merge into DB2ADMIN.saldo as a
using (select podrazd_id, kredit_id, kredit_partner_id, kredit_analitika_id, sum(summa) as summa
from old group by podrazd_id, kredit_id, kredit_partner_id, kredit_analitika_id) as b
on a.podrazd_id = b.podrazd_id
and a.subcount_id = b.kredit_id
and a.partner_id = b.kredit_partner_id
and a.analitika_id = b.kredit_analitika_id
when matched then update set summa_kredit = summa_kredit - b.summa;

END

Вот такая таблица:
CREATE TABLE "DB2ADMIN"."SALDO" (
"PODRAZD_ID" BIGINT NOT NULL ,
"SUBCOUNT_ID" BIGINT NOT NULL ,
"PARTNER_ID" BIGINT NOT NULL ,
"ANALITIKA_ID" BIGINT NOT NULL ,
"SUMMA_DEBET" DECIMAL(20,2) NOT NULL ,
"SUMMA_KREDIT" DECIMAL(20,2) NOT NULL ,
"PODRAZD_PARTNER" BIGINT NOT NULL )
IN "DATA" INDEX IN "INDEX_8" ;
ALTER TABLE "DB2ADMIN"."SALDO" PCTFREE 20;

-- Операторы DDL для индексов таблицы "DB2ADMIN"."SALDO"

CREATE INDEX "DB2ADMIN"."IND1_SALDO" ON "DB2ADMIN"."SALDO"
("PODRAZD_PARTNER" ASC)
PCTFREE 10 MINPCTUSED 10
ALLOW REVERSE SCANS;

-- Операторы DDL для индексов таблицы "DB2ADMIN"."SALDO"

CREATE INDEX "DB2ADMIN"."IND2_SALDO" ON "DB2ADMIN"."SALDO"
("PARTNER_ID" ASC)
PCTFREE 10 MINPCTUSED 10

ALLOW REVERSE SCANS;


-- Операторы DDL для первичных ключей таблицы "DB2ADMIN"."SALDO"

ALTER TABLE "DB2ADMIN"."SALDO"
ADD CONSTRAINT "CC1166263937297" PRIMARY KEY
("PODRAZD_ID",
"SUBCOUNT_ID",
"PARTNER_ID",
"ANALITIKA_ID");

Вот так пытаюсь сделать....
...
Рейтинг: 0 / 0
02.02.2007, 12:03
    #34301688
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
сделайте
runstats on table db2admin.saldo and indexes all
и покажите план запроса для этого merge.
Какой процент записей обновляется в db2admin.saldo при удалении из db2admin.provod?

И еще: вы не "ослабите" эксклюзивные блокировки уровнем изоляции UR:
Если вы изменили некоторую строку, то эксклюзивная блокировка этой строки останется до конца транзакции при любом уровне изоляции.
...
Рейтинг: 0 / 0
02.02.2007, 12:09
    #34301713
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Так строка - это ничего страшного... Зачем же блокируется целая таблица? Я увеличил locklist, но это не помогает....
После runstats нужно пересобирать триггеры?
...
Рейтинг: 0 / 0
02.02.2007, 12:14
    #34301735
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Процент очень-очень не большой.... Там и процентом-то нельзя назвать.... А maxlocks стоит 22(по умолчанию)... LOcklist на всякий выставил 4096*4Kb... Вроде все должно хватать.....
...
Рейтинг: 0 / 0
02.02.2007, 12:18
    #34301754
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
TORTПосле runstats нужно пересобирать триггеры?Нет.
...
Рейтинг: 0 / 0
02.02.2007, 12:22
    #34301785
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Explain.sql выдает стоимость 143,76....
При работе с таблицей saldo используется индекс CC1166263937297
...
Рейтинг: 0 / 0
02.02.2007, 12:42
    #34301877
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
TORTExplain.sql выдает стоимость 143,76....
При работе с таблицей saldo используется индекс CC1166263937297Как же у вас тогда вся таблица блокируется?
Как вы это определили?

Может:
1. Уровень изоляции приложения - RR?
2. У таблицы LOCKSIZE сделали TABLE?
3. Приложение коммититься забывает?

Сделайте
UPDATE MONITOR SWITCHES USING LOCK ON
UPDATE COMMAND OPTIONS USING C OFF
DELETE FROM DB2ADMIN.PROVOD ...
GET SNAPSHOT FOR LOCKS FOR APPLICATION AGENTID ваш_номер_агента

Вывод последней команды покажите.
...
Рейтинг: 0 / 0
02.02.2007, 12:50
    #34301919
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Определил с помощью Quest'а.... В момент когда происходит удаление из db2admin.provod возникает блокировка Exclusive(S) на таблицу SALDO.....
...
Рейтинг: 0 / 0
02.02.2007, 12:50
    #34301921
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Пардон Exclusive(X)
...
Рейтинг: 0 / 0
02.02.2007, 12:53
    #34301935
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
И размер блокировки на таблицу - Строка.....:(
...
Рейтинг: 0 / 0
02.02.2007, 13:08
    #34302005
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Снимок блокировок программы

Отметка времени снимка = 02.02.20

Хэндл прикладной программы = 586
ID прикладной программы = *LOCAL
Номер последовательности = 0001
Имя прикладной программы = db2bp.
ID авторизации CONNECT = db2adm
Состояние прикладной программы = Рабоча
Время изменения статуса = Не соб
Кодовая страница прикладной программы = 1251
Блокировок поддерживается = 9
Общее время ожидания (мс) = 0

Список блокировок
Имя блокировки = 0x050010002D413E010000000052
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 20857133
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = X

Имя блокировки = 0x050010002E413E010000000052
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 20857134
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = X

Имя блокировки = 0x0500100040991E010000000052
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 18782528
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = X

Имя блокировки = 0x0500070045500D020000000052
Атрибуты блокировки = 0x00000020
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 34426949
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = PROVOD
Режим = X

Имя блокировки = 0x0500070044500D020000000052
Атрибуты блокировки = 0x00000020
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 34426948
Тип объекта = Строка
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = PROVOD
Режим = X

Имя блокировки = 0x53514C4332453036BD4A32C841
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 0
Тип объекта = Внутренн
Режим = S

Имя блокировки = 0x53514C4445464C5428DD630641
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 0
Тип объекта = Внутренн
Режим = S

Имя блокировки = 0x05000700000000000000000054
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 1
Число удержаний = 0
Имя объекта блокировки = 7
Тип объекта = Таблица
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = PROVOD
Режим = IX

Имя блокировки = 0x05001000000000000000000054
Атрибуты блокировки = 0x00000000
Флаги освобождения = 0x40000000
Число блокировок = 2
Число удержаний = 0
Имя объекта блокировки = 16
Тип объекта = Таблица
Имя табличного пространства = DATA
Схема таблицы = db2admin
Имя таблицы = SALDO
Режим = IX
...
Рейтинг: 0 / 0
02.02.2007, 13:23
    #34302091
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Так это...
Все нормально у вас, эксклюзивно таблицы не блокируются.
Может, quest не отличает IX блокировки таблицы от X?
...
Рейтинг: 0 / 0
02.02.2007, 13:28
    #34302119
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Сам вот сижу и думаю....
В любом случае спасибо за советы...
...
Рейтинг: 0 / 0
02.02.2007, 13:39
    #34302176
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
А если это делается в хранимой процедуре? Монитор блокировки будет фиксировать?
...
Рейтинг: 0 / 0
02.02.2007, 14:08
    #34302337
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Ну так... На всякий....
Одна процедура = Один пакет?
...
Рейтинг: 0 / 0
02.02.2007, 14:43
    #34302494
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
TORTА если это делается в хранимой процедуре? Монитор блокировки будет фиксировать?Да.
TORTОдна процедура = Один пакет?Да.
...
Рейтинг: 0 / 0
02.02.2007, 14:48
    #34302519
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Кажется нашел момент... Может для вас очевидный, я же его упустил....
В общем дело так....
Записи из таблицы provod удаляются также триггером, повешенным на другую таблицу!!!
Так вот, если делать Explain на delete from provod...., то индексы по saldo хватаются....
А если через еще один триггер, то нет...
...
Рейтинг: 0 / 0
06.03.2007, 14:38
    #34374642
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггеры... Поделитесь опытом
Опять на те же грабли.... Где архитектурно могу ошибаться?
Есть таблица1, таблица2, таблица3....
При изменении таблицы1, изменяется таблица2.
При изменении таблицы2, изменяется таблица3.
Все это организовал на триггерах... По-моему очень удобно получилось...
Но при тестировании получается, что одна программа, изменяя таблицу1 эксклюзивно блокирует таблицу3... Соответственно все остальные приложения "курят"... К тому же, таблица1 изменяется довольно часто и совсем небольшими порциями...
1.Где чего не так понимаю?
И главное.... Так вообще делают или за это руки "отрывают"....?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Триггеры... Поделитесь опытом / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]