Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak zadziala transakcja?
ins@ne
post 15.11.2004, 21:34:54
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.07.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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...


--------------------
"Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein
Go to the top of the page
+Quote Post
toszcze
post 17.11.2004, 17:58:11
Post #2





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 18.12.2003

Ostrzeżenie: (0%)
-----


Niestety, ale Twoj kod doda do tabeli TabelaStatystyk dwa rekordy (niezaleznie od tego, czy obejmiesz INSERTy transakcja, czy nie).


--------------------
WebHelp.pl
Go to the top of the page
+Quote Post
ins@ne
post 18.11.2004, 01:50:56
Post #3





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.07.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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?


--------------------
"Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein
Go to the top of the page
+Quote Post
harmag
post 18.11.2004, 09:07:09
Post #4





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 17.08.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.07.2025 - 15:06