[postgres] ciekawe pytania odnosnie transakcji i triggerow

0

Tabela ma zalozony "trigger before insert".
Czy jesli teraz robie insert, to czy
a)to jest operacja atomowa jak zwykly insert bez zalozonego
triggera?
b) jesli dojdzie do kilku zapytan inserta w TYM SAMYM momencie,
to czy operacje w triggerach (selecty itd) beda naprzemiennie
sie wykonywac przez co wyjdzie niezly bajzel?
c) a moze w TYM SAMYM momencie nie da sie wywolac wiecej niz
jeden trigger na zapytaniu insert na tej samej tabeli?

Czy jesli robie transakcje, a w tej transakcji wykonuje tylko inserta z zalozonym triggerem i w triggerze mam select into zmienna.... for update to czy ten select for update rzeczywiscie zablokuje znalezione wiersze ???

dzieki

0
LJ napisał(a)

Tabela ma zalozony "trigger before insert".
Czy jesli teraz robie insert, to czy
a)to jest operacja atomowa jak zwykly insert bez zalozonego
triggera?

nie bardzo rozumiem o co Ci chodzi. Insert to insert a trigger to trigger. Najpierw wykona się to co w triggerze i ew. pola zostaną uzupełnione a potem dane z inserta

b) jesli dojdzie do kilku zapytan inserta w TYM SAMYM momencie,
to czy operacje w triggerach (selecty itd) beda naprzemiennie
sie wykonywac przez co wyjdzie niezly bajzel?

każda transakcja ma swój "obraz" bazy, dokładnie taki jaki był w momencie startu transakcji (przy ReadCommited) i z takimi danymi będzie działać. Jak masz kilka insertów w różnych transakcjach to każdy ma swoje dane, a jak w jednej transakcji to NIE da się ich uruchomić jednocześnie

c) a moze w TYM SAMYM momencie nie da sie wywolac wiecej niz
jeden trigger na zapytaniu insert na tej samej tabeli?

patrz wyżej

Czy jesli robie transakcje, a w tej transakcji wykonuje tylko inserta z zalozonym triggerem i w triggerze mam select into zmienna.... for update to czy ten select for update rzeczywiscie zablokuje znalezione wiersze ???

tak

0

Moze napisze dokladniej.
Jest tabela MAGAZYNY w ktorej trzymam id magazynow oraz ich pojemnosc max.
Jest tez tabela SKLAD (id mahazynu,id towaru,ilosc towaru).

Operacja dodania nowego towaru do magazynu (=dodanie wiersza do tabeli SKLAD) polega na tym, ze przed insertem uruchamia sie trigger, który robi:

1)sprawdza sobie max pojemnosc maagzynu z tabeli magazyn
2)sprawdza po nr id magazynu z tabeli SKLAD jakie towary sa w magazynie
3) odejmuje 1) - 2) zeby sprawdzic aktualne wolne miejsce w magazynie
4) jesli wolne miejsce >= ilosc towaru, ktory chce wlozyc => robi insert

I teraz pytanei , co jak 2 osoby chca dodac do tego samego magazynu w tym samym momencie.
Pierwsza chce dodac 10palet i powiedzmy druga tez 10palet. W magazynie mamy dokladnie miejsce na 10 palet.

I w najgorszym przypadku 1 osoba wykona punkty 1)-3) po czym natychmiast druga osoba tez wykona punkty 1)-3). W tej sytuacji obie zrobia insert i baza bedzie NIESPOJNA, bo bedzie nadmiarowe 10 palet.

0

no to zablokuj możliwość edycji SKLAD innym na czas dodawania towaru i już

0

to napisz jeszcze jak to najlepiej zrobic ?

dac select for update? ale wtedy potrzebuje transakcji bo bez tego nie zadziala, tak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0