Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zadziala transakcja?
Forum PHP.pl > Forum > Bazy danych
ins@ne
Witam,
Sprawa dotyczy Oracle'a, ale generalnie chodzi o dzialanie transakcji (wiec kazda baza, ktora je obsluguje powinna miec podobne rozwiazanie). Mam taka sytuacje, ze mam dwie tabele o nastepujacej budowie (pominalem typy danych, restrykcje, zbedne pola itp. - uwzglednilem tylko elementy istotne):
  1. TabelaZadan (
  2. id_zadania,
  3. status_zadania);
  4.  
  5. TabelaStatystyk (
  6. ilosc_zadan,
  7. ilosc_wykonanych_zadan);

Sprawa wyglada nastepujaco:
Musze o pewnej okreslonej godzinie kazdego dnia wpisac do tabeli statystyk informacje o lacznej ilosci zadan z tabeli zadan, ale w ten sposob, ze w pole ilosc_zadan wpisze:
  1. count(id_zadania)
- czyli wszystkie zadania jakie zostaly wykonane, a w pole ilosc_wykonanych_zadan wpisze
  1. count(id_zadania) WHERE status_zadania = 1

Jako, ze nie da sie (o ile mi wiadomo) ulozyc tego w jednym warunku (a musi byc to wykonane w tym samym czasie) bo gdy dodam warunek to bedzie on rowniez dotyczyl tej funkcji agregujacej po calosci, wpadlem na pomysl zeby zastosowac transakcje. Oto jak to widze:
Kod
Poczatek transakcji:
insert into TabelaStatystyk(ilosc_zadan) select count(id_zadania) from TabelaZadan;
insert into TabelaStatystyk(ilosc_wykonanych_zadan) select count(id_zadania) from TabelaZadan where status_zadania = 1;
Koniec transakcji.

Chodzi mi teraz o to czy transakcja obsluzy to tak jak mi sie wydaje, ze powinna obsluzyc smile.gif. Konkretnie: chce zeby przed zakonczeniem transakcji powstal mi wpis, w ktorym bedzie w jednej kolumnie zapis o lacznej ilosci zadan, a w drugiej kolumnie (tego samego rekordu) zapis o ilosci zadan spelniajacych warunek. Jak to bedzie wygladalo z punktu widzenia dzialania transakcji?
Jak tak nad tym myslalem to powstaje mi takie pytanie: skad baza danych bedzie wiedziala, ze ta druga operacje wykonac na tym samym rekordzie i ze to wlasnie ten rekord ma byc powiekszony o jedna kolumne... I z tym sie wlasnie zwracam do Was - mam nadzieje, ze ktos takie cos przerabial albo chociaz wie teoretycznie jak to rozwiazac. Z gory dziekuje za wszelka pomoc...
toszcze
Niestety, ale Twoj kod doda do tabeli TabelaStatystyk dwa rekordy (niezaleznie od tego, czy obejmiesz INSERTy transakcja, czy nie).
ins@ne
A gdybym w transakcji zrobil cos takiego, ze najpierw bym utworzyl zmienna, w ktora bym wrzucil wynik select liczacego ilosc wykonanych zadan, a jako drugie polecenie selecta po calosci (czyli te pozostale dane) i w nim w pole, w ktorym mialaby sie znalezc ilosc wykonanych zadan bym "wrzucil" ta zmienna? Tak by zadzialalo?
harmag
dobrze kombinujesz, tylko do tego celu musisz chyba uzrzyc juz proceduralnego SQL'a.

zrob to mniej wiecej tak.

przykladowy blok anonimowy
Kod
DECLARE
  wszystkie NUMBER;
  wykonane NUMBER;
BEGIN
  SELECT count(id_zadania) INTO wszystkie FROM TabelaZadan;
  SELECT count(id_zadania) INTO wykonane FROM TabelaZadan WHERE status_zadania = 1;
  INSERT INTO TabelaSatystyk VALUES(wszystkie,wykonane);
END


nigdy osobiscie czegos takiego nie pisalem, ale z teori wydaje mi sie ze taki bloczek mniej wiecej bygladal by tak.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.