Blokady zakładane przez insert ? Co tu może byćnie tak ?
Filip Sielimowicz - 27-01-2006 10:46
Blokady zakładane przez insert ? Co tu może byćnie tak ?
Baza ibm db2 8.2, ale być może np. w MsSql'u jest podobnie, wiec nie dałem w nagłówku.
Sytuacja wygląda tak: 1. OTWIERAMY TRANSAKCJĘ. Każda transakcja modyfikująca dane w bazie na samym początku dba o stworzenie odpowiedniego kontekstu. W bazie siedzi tabela PARAMETRY_TRANSAKCJI_BD z kluczem głównym. Pierwsze zapytanie w ramach transakcji to zawsze insert rekordu do tej tabeli. insert into select ID from PARAMETRY_TRANSAKCJI_BD(ID) values(nextval for MY_SEQ)
2. OPERACJE W RAMACH TRANSAKCJI W czasie transakcji na różnych tabelach są robione operacje insert/update/delete. Operacje te są pilnowane, tzn. przed każdą zmianą są robione kopie starych rekordów i przepisywane do osobnych, wydzielonych tabel. Każda kopia jest oznaczana m.in. identyfikatorem transakcji, wydobywanym w sposób prosty: select ID from PARAMETRY_TRANSAKCJI_BD Czyli każdy trigger wykonuje takie zapytanie. Mamy więc coś na kształt własnego logu transakcyjnego.
3. KOŃCZYMY TRANSAKCJĘ Na koniec jest wykonywane usunięcie rekordu kontekstu: delete from PARAMETRY_TRANSAKCJI_BD
Sprawa jest wiec prosta: niezależnie od tego, czy transakcja siępowiedzie, czy nie, po jej zakończeniu nie ma prawa zostać żaden rekord w tabeli kontekstu. Zakładając rozsądny poziom izolacji transakcji, nie ma też możliwości, by inne transakcje zobaczyły nie swój rekord.
PROBLEM: To rozwiązanie budzi wiele wątpliwości pod względem blokad. W praktyce obserwujemy, iż transakcje mają skłonność do zawieszania się na operaji INSERT (krok 1), jeśli w tym samym czasie inne transakcje są w trakcie (np. tuż przed delete, krok 3). W zasadzie nie jest to skłonność, a pewniak w obecnej chwili.
Mam trudności z określeniem co tu jest dla kogo blokowane i dlaczego innym ta blokada przeszkadza. Pytanie, raczej dla znawców db2: czy jest możliwe, że np. operacja select ID from PARAMETRY_TRANSAKCJI_BD (w każdym triggerze) zakłada mi table locka ? No bo czy jest inna możliwość dająca w efekcie blokadę operacji insert ?
Czy dodanie w tym zapytaniu FOR READ ONLY powinno istotnie pomóc ?
Czy może w ogóle należy zrezygnować z tabeli PARAMETRY_TRANSAKCJI_BD i np. w jej miejsce robić tabele tymczasowe na każdym połączeniu z bazą danych (tylko, czy triggery takie coś przyjmą ?). Czy należy oczekiwać, że ta tabela zawsze będzie wąskim gardłem w takiej bazie, jak db2 ?
Może jest jakiś inny, lepszy sposób, by dla każdej transakcji db2 zapewnić odpowiedni kontekst (widoczny z triggerów) ?
Za wszelkie podpowiedzi będę bardzo wdzięczny.
-- Filip Sielimowicz http://panda.bg.univ.gda.pl/~sielim/genetic/index.htm
Filip Sielimowicz - 27-01-2006 10:46
Użytkownik "Filip Sielimowicz" <sielim@poczta.onet.pl> napisał w wiadomości news:dra6ec$g8j$1@news.onet.pl... > Baza ibm db2 8.2, ale być może np. w MsSql'u jest podobnie, wiec nie dałem w > nagłówku. > > Sytuacja wygląda tak: > 1. OTWIERAMY TRANSAKCJĘ. > Każda transakcja modyfikująca dane w bazie na samym początku dba o > stworzenie > odpowiedniego kontekstu. W bazie siedzi tabela PARAMETRY_TRANSAKCJI_BD > z kluczem głównym. Pierwsze zapytanie w ramach transakcji to zawsze insert > rekordu > do tej tabeli. > insert into select ID from PARAMETRY_TRANSAKCJI_BD(ID) values(nextval for > MY_SEQ)
Tu się wkradł jakiś paszkwil. Powinno być: insert into PARAMETRY_TRANSAKCJI_BD(ID) values(nextval for MY_SEQ)
Filip Sielimowicz - 27-01-2006 10:47
Użytkownik "Filip Sielimowicz" <sielim@poczta.onet.pl> napisał w wiadomości news:dra6ec$g8j$1@news.onet.pl...
> Mam trudności z określeniem co tu jest dla kogo blokowane i dlaczego innym > ta blokada > przeszkadza. > Pytanie, raczej dla znawców db2: czy jest możliwe, że np. operacja > select ID from PARAMETRY_TRANSAKCJI_BD (w każdym triggerze) > zakłada mi table locka ? No bo czy jest inna możliwość dająca w efekcie > blokadę operacji > insert ? > > Czy dodanie w tym zapytaniu FOR READ ONLY powinno istotnie pomóc ?
To ostatnie odpada, bo wewnątrz triggerów nie można stosować for read only.
Za to, coraz bardziej przekonani, że to ten select robi blokadę na całej tabeli, obadamy rozwiązanie, w którym użyjemy funkcji application_id() do oznaczania rekordów w tabeli z kontekstem.
Będzie więc insert z oznaczeniem identyfikatorem połączenia z bd, potem select też będzie filtrowany po id połączenia i podobnie na końcu delete. Liczę na to, że teraz będą już locki tylko na jednym rekordzie, więc problem powinien zniknąć. Zobaczymy.
-- Filip Sielimowicz http://panda.bg.univ.gda.pl/~sielim/fractal/index.htm
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
Tworzenie tabeli z =?ISO-8859-2?Q?nazw=B1_ustalan=B1_przez_?==?ISO-8859-2?Q?usera?=
[ORACLE] - jak =?ISO-8859-2?Q?zwr=F3ci=E6_list=EA_u=BFytkown?==?ISO-8859-2?Q?ik=F3w_tworzonych_przez_Oracle?=
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
Insert do tabeli danymi z innej tabeli Firebird
[mssql] insert do tabeli na podstawie danych z innej tabeli
Insert do tabeli z danych innej tabeli plus dodatkowa wartośćpola (Firebird)
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
Import faktur do Insert Subiekt GT oraz Wapro Wf-Mag z innego programu
=?iso-8859-2?Q?=5BMySQL=5D_Wy=B6wietlenie_wszystkich_rekordow _zawierajacy?==?iso-8859-2?Q?ch_duplikat_a__moze_inna_struktura_bazy_danych ?=
zanotowane.pldoc.pisz.plpdf.pisz.plred-hacjenda.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|