Strona 1 z 1

Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 14:34:05
przez Júzek
Witam.
Zakładamy, że: skrypt add.php dodaje wartości do wielu tabel; w kolumnie kol_1 tabeli tab_1 musi być wartość klucza auto_inc... z tabeli tab_2. Funkcja mysql_insert_id() zwróci mi ostatni klucz, czyli w sytuacji gdy strona dodaje "miliony" wartości może zdarzyć się, że klucz główny z kluczem obcym nie będą się zgadzać.

Jak zapewnić atomowość tego typu INSERTów ?

Czy w przypadku polecenia "polecenie 1; polecenie 2" ową atomowość się zapewni ?

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 15:03:11
przez junior
polecam funkcję mysql: MySQL LAST_INSERT_ID()

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 15:33:17
przez Júzek
Jeżeli zwraca (wg. nazwy) ostatni klucz - to nie zmienia to mojej sytuacji. Przyjmijmy nazwy: tab_1 -> "Temat" tab_2 -> "Treści". Treści odnoszą się do Tematów przez referencje (równość klucza głównego Tematu z kluczem obcym Treści). Czyli Treść "żaba" należy do tematu "płazy". W przypadku gdy nie ma kontroli nad kolejnością dodawania wartości do tabel może się zdarzyć, że Temat Treści "człowiek" zostanie wyprzedzony przez Temat "ptak" w rezultacie powstanie oczywisty błąd. I właśnie takiej sytuacji chce zapobiec :]

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 16:35:27
przez BlueMan
Robiłeś jakiś testy, że sądzisz, że moga wystąpić przekłamania? Bo wg. mnie nie ma szans na to... .
Po 2 wytłumaczeniu dopiero skumałem o co cho:]
W C++ to się nazywa sekcja krytyczna i ustawia się mutexa pomiędzy 2 krytycznymi zmiennymi.
W mysql wg. mnie takie coś nie ma szans wystąpić. Poczytaj o różnego typu transakcjach - one potrafią blokować dostep do tabel w momencie pracy nad nimi (inny wątek nie uzyska dostępu do niego). No i transakcje mają ten plus, żę jak jedno zapytanie się nie powiedzie, to inne nie zostaną wykonane :]

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 16:41:11
przez Júzek
Propo testów, wieczorem podsmażę procka i opublikuje wyniki :]
A co do transakcji, miałem, nadzieje, że rozwiąże to łatwiej. Ale jak trzeba będzie to przetrzepie notatki z uczelni....

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 19:03:18
przez junior
tyle, że mysql to tak średnio transakcyjny jest....

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 19:29:31
przez BlueMan
Júzek, pamiętaj, że tabele muszą być jako INODB a nie MyISAM :]
No i MySQL w wersji 5.

junior, czemu niby?

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 19:49:54
przez Júzek
Wg mojego PMA InnoDB mam wyłączone. Jak to włączyć ? (A dlaczego InnoDB to sobie doczytam :])

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 20:28:10
przez BlueMan
Tzn, nie "włączyć", ale przy tworzeniu tabel trzeba wyklikać, aby były one stworzone w tej postaci.
Bo chyba nie da się tego "wyłączyć" :D

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 20:38:42
przez Júzek
Tada :]
Obrazek

Wersja serwera: 5.0.51a
Wersja klienta MySQL: 5.0.51a

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 20:47:31
przez BlueMan
Kod: Zaznacz cały
alter table table_name engine=innodb;
może takie coś pomoże :]


A co do Twojego obrazka, to faktycznie u mnie w serwerze tez miałem go wyłączonego :]

/etc/mysql/my.cnf
i tam miałem
Kod: Zaznacz cały
skip-innodb

Zahashowałem i już mi działa :]

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 20:50:30
przez junior
Bluman, nie wiem na razie czemu :) ale z kim gadam z profesorków na uczelni o mysql to zawsze kręcą nosem, że mysql nie potrafi dopilnować kolejności operacji i często wycofanie operacji jest niemożliwe.

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 20:53:59
przez BlueMan
To ja jestem żywym przykładem, że się da. Często stosuje w skrypcie transakcje i działają dobrze.
Wiem, bo nie raz jak testuje, to ręcznie sprawdzam, az w końcu phpmyadmin wyłoży mi się na jakimś zapytaniu.
Potem ręcznie musze usuwać poprzednie zapytania, a tak to PHP za mnie to robi w transakcjach.

Można zrobić przecież prosty test "czy działa" i się dowiesz :]

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 21:00:06
przez junior
problemy zaczynają się gdy wiele osób korzysta z tych samych danych i baza jest duża :)

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 21:22:49
przez Júzek
Blueman napisał(a):Zahashowałem i już mi działa :]


junior napisał(a):problemy ... jest duża :)

... i właśnie taka się zapowiada :]

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 21:25:18
przez BlueMan
No to zmień silnik bazy danych na płatnego Oracle xD
MySQL nie nadaje się do DUUUŻYCH projektów :P

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 21:28:41
przez Júzek
Baza siedzi na zewnętrznym serwerze wybranym "z góry" przez klient laika... obawiam się że będę musiał przypomnieć adminowi o register_globals... No ale to nie mój problem. W dokumentacji opisze wymagania projektu co uchroni mój zadek :]

Re: Atomowość ciągu zapytań sql

PostNapisane: 2008-11-09, 21:49:00
przez junior
oracle jest bezpłatny dopóki nie próbujesz na nim zarabiać:D