jolam
21.11.2009, 20:21:38
Chciałam się zapytać jak używać transakcji i jak zapobiegać błędom podczas jednoczesnego dostępu do bazy prze zkilka osób? Np dwie osoby jednocześnie dodają do bazy artykuł. Ale do artykułu dodawane są tez zdjęcia. Czyli dodawany jest artykuł, potem pobierany jest największy id z tabeli artykułów, następnie dodawane jest zdjęcie, potem największy id z tabeli zdjęć i potem oba id mają trafić do tabeli łączącej zdjęcia z artykułami. Ale jeśli druga osoba będzie dodawać inny artykuł w tym samym czasie, to podczas pobierania największego id zdjęcia lub artykułu może dojść do pomyłki. A tego bardzo bym nie chciała. Co zrobić, żeby uniknąć takich kłopotów. Żeby baza danych po kolei obsługiwała CAŁE dodanie artykułu i zdjęcia i odpowiedniego wpisu do tabeli łączącej.
Bardzo prosiłabym o jakieś instrukcje jak to się powinno wykonywać, tak kroczek po kroczku, żeby mogła dobrze zrozumieć.
Pozdrawiam najserdeczniej Jola
korro
23.11.2009, 09:20:46
Witam.
Pozwolę sobie podlinkować artykuł z mojego bloga:
http://antczak.org/2009/11/pobieranie-id-d...e-i-postgresql/Z jakiej bazy zamierzasz korzystać?
jolam
23.11.2009, 14:54:58
Moją bazą jest SQLITE, czy w takim razie nie uda mi się tego osiągnąć? A może jednak, ale jak?

Pozdrawiam najserdeczniej Jola
korro
23.11.2009, 17:15:50
Da się jak najbardziej.
Autoincrement:
http://www.sqlite.org/autoinc.htmlZwracanie ostatnio wygenerowanego id:
http://www.sqlite.org/c3ref/last_insert_rowid.htmlDziałą to w ten sposób, że dostajesz id rekordu wstawionego w danym połączeniu, wiec jest to bezpieczne.
jolam
24.11.2009, 11:23:33
Przepraszam, że tak się głupio pytam, ale jak użyć tego polecenia poprzez PDO? I czy to jest na pewno bezpieczne? Czy jeśli kilka osób będzie jednocześnie dodawać albo zmieniać rekordy, to czy każdy na pewno dostanie numer tego wiersza który wstawił/zmienił? I czy zamiast rowid mógłby to być np adres ip z tabeli?
A może da się się zrobić taką sekwencje zapytań, tak żeby wykonały się wszystkie a jeśli choć jedno nie może (bo jest błędne), to nic się w bazie nie zmienia?
Korzystając z okazji (bo widzę, że znasz się na tych bazach) muszę zapytać co zrobić, żeby dobrze posortować tabele według jednej kolumny zawierającej tekst? Po prostu sortowanie alfabetyczne. Bo teraz jak mam duże i małe litery i polskie albo greckie litery, to mi się źle sortuje. Jakby tabela była dzielona na kilka mniejszych podtabel i tych kilka posortowanych osobno było łączone w jedną tabelę.
Bardzo Cię proszę o pomoc.
Pozdrawiam najserdeczniej Jola
korro
25.11.2009, 06:18:35
http://www.php.net/manual/en/pdo.lastinsertid.php,
co do bezpieczeństwa to sprawdź sama, stwórz środowisko symulujące.
jolam
25.11.2009, 13:36:39
Faktycznie jest taka funkcja w PDO!
Ale nie wiem ja sama mogłabym sprawdzić jej działanie, czy jest bezpieczna? Czy przy jednoczesnych zapisach do bazy, każdy użytkownik bazy otrzymywał swoje a nie pomylone lastinsertedid?
Podpowiesz jak to sprawdzić?
I czy wiesz coś na temat tego sortowania?
pozdrawiam Jola
korro
25.11.2009, 13:41:42
Sprawdzić można w prosty sposób, dwie przeglądarki i dodawanie rekordów.
Co do sortowania to nie mam doświadczeń z SQLite. Prawdopodobnie chodzi o kodowanie.
jolam
1.12.2009, 11:33:01
koro aż taka głupia to nie jestem, ale dwie przeglądarki to za mało. Przecież nie kliknę jednocześnie i może się zdarzyć, że zapisy do bazy wykonają się szczęśliwie jeden po drugim.
Proszę doradź mi czy lepiej zacząć używać POSTGRSQL czy MYSQL? Bo obie bazy mają bardzo wiele fajnych funkcji, których SQLITe nie ma. Ale nie wiem co lepiej wybrać? Jakie jest zdanie praktyka, eksperta w tej sprawie?
pozdrawiam serdecznie Jola

?
piotrooo89
1.12.2009, 11:42:34
Jak wiesz ze będziesz miała dużo rekordów, tabel w bazie wybierz Postgresa, jeśli coś mniejszego MySQL w zupełności Ci wystarczy. Tylko wiedz jak będziesz się chciała przesiąść z MySQL'a na Postgresa to może być lekki problem.
Ja osobiście w pracy używam Postgresa ale mamy tu baze zajmującą ok. 1GB, dla projektów dla jakiś drobnych firm dla których tworze strony używam MySQL'a. Czyli tak jak mówię wszystko zależy od potrzeb.
jolam
1.12.2009, 14:26:40
Ja nie zarabiam na robieniu stron - to moje nowe hobby

Jeśli dobrze rozumiem, to dla małych projektów lepszy jest MySQL a dla dużych Postgres? Zmiana bazy z Mysql na Postgres nie jest możliwa a w druga stronę?
Czy mógłbyś mi najlepiej w prosty sposób wytłumaczyć w czym Mysql jest lepszy od Postgresa dla małych projektów i odwrotnie w czym Postgres dla dużych?
Pozdrawiam serdecznie.
Jola
piotrooo89
1.12.2009, 14:54:15
mysql->postgres nie tyle nie możliwa co lekko problematyczna, postgres->mysql nie ma problemu (przynajmniej ja nie słyszałem). tak zdecydowanie polecam mysql'a do czegoś małego, bo jak nie masz jakiś widoków, nie wiadomo jakich funkcji, to tak jak strzelania do muchy z armaty.
a co do różnic to w necie poczytaj:
KLIK
jolam
9.12.2009, 10:36:58
Muszę jeszcze o coś spytać.
Co zrobić żebym mogła korzystać z transakcji w formularzu? To znaczy chcę zrobić jakąś operacje na bazie poprzez formularz. Następnie chcę sprawdzić jej efekt na stronie. I potem znowu w formularzu chciałabym zdecydować czy cofnąć transakcje czy ją zachować? Jak to zrobić?
Aktualnie na jednej stronie formularza wykonuję zapytanie do bazy poprzedzone rozpoczęciem transakcji, a na nastepnej stronie formularza chcę ją potwierdzić albo anulować (rollback). Ale dostaje komunikat: "There is no active transaction"
Bardzo prosiłabym o pomoc.
Gapollo
23.12.2009, 09:04:40
...Czyli dodawany jest artykuł, potem pobierany jest największy id z tabeli artykułów, następnie dodawane jest zdjęcie, potem największy id z tabeli zdjęć i potem oba id mają trafić do tabeli łączącej zdjęcia z artykułami...
To nie jest dobry pomysł. Wyobraź sobie sytuację w której user zapisuje artykuł, przechodzi do dodawania zdjęć i w tym momencie... nerwowo szuka pendriva po kieszeniach. Acha jest w torbie w samochodzie. W tym czasie sesja wygasa. Zdjęcia powinny być dodawane w dowolnym momencie edytowanego artykułu, następnego dnia na przykład.
Co do ostatniego pytanka. Zostawianie otwartej transakcji w oczekiwaniu na reakcję użytkownika jest moim zdaniem poważnym błędem. Otwarta transakcja może blokować innych użytkowników oraz operacje administracyjne na bazie.
1. Proponuję zamiast tego zbudować "brudnopis" ze wszystkich tabel uczestniczących w transakcji. Kopiować dane do brudnopisu i stamtąd je wyświetlać.
2. Albo ropocząć transakcję, wykonać update, wyświetlić wynik w nowym dokumencie (iframe lub ajax), zamknąć transakcję rollbackiem.
jolam
15.01.2010, 14:16:53
Gapollo mógłbyś wyjaśnić te pomysły? Szczególnie ten pierwszy? Powiedz czy taki brudnopis uchroni przed błędem jeśli w jednym momencie zostanie wysłanych ileś zapytań do bazy?
pozdrawiam Jola
Gapollo
15.01.2010, 23:44:34
Brudnopis pozwoli Ci na wyświetlenie całego artykułu przed zatwierdzeniem. Zatwierdzenie artykułu możesz wykonać w jednej transakcji, uchroni to przed błędem pomieszania treści i zdjęć (jakby to miało miejsce gdybyś użyła max_id). Oczywiście wszystkie wyświetlania z brudnopisu trzeba filtrować po user_id, żeby kilka osób mogło jednocześnie z brudnopisu korzystać.
jolam
16.01.2010, 20:10:48
Rozumiem, chyba. Aktualizacje wszystkich tabel i wpisów mają się odbyć w jednej transakcji a do tego czasu dane mają być zapisane gdzieś tymczasowo (w brudnopisie) albo przekazywane między kolejnymi stronami brudnopisu. Czy tak?
Tylko jeśli w jednej tabeli mam artykuły a w innej tabeli obrazki a w jeszcze innej tabeli łącze jedno z drugim. To, żeby zrobić wpis do tej tabeli łączącej muszę posiadać identyfikator artykułu i identyfikator obrazka. Czy jeśli w jeden transakcji dodam wiersz do tabeli z artykułami (i pobiore maksymalny identyfikator), dodam wiersz do tabeli z obrazkami (i pobiore maksymalny identyfikator), dodam wiersz do tabeli łączącej z pobranymi wcześniej maksymalnymi identyfikatorami, to czy to będzie dobre? Czy jeśli kilka osób jednocześnie, z kilku komputerów będzie tak aktualizować bazę to będzie dobrze? Nic się nie pomiesza? Chyba nie bardzo rozumiem o co chodzi z tym brudnopisem, jak pozwoli on na nie pobieranie max id?
Która baza danych jest wygodniejsza w używaniu mySQL, czy PostgreSQL?
A jak myślicie, czy to prawda, że ten cały mySQL będzie zlikwidowany przez ORACLE?
pozdrawiam najserdeczniej Jola
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.