Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Transakcja
Marq
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 5
Dołączył: 14.10.2008
Skąd: Tarnów

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


Witam!




Mam problem z stworzeniem zapytania do bazy danych, który mógłby obsłużyć taką transakcję:

- dodaję zamówienie do bazy danych (data złożenia, kto etc etc)

- dodaję pozycje, które były w tym zamówieniu (każda pozycja musi mieć numer zamówienia, które wcześniej dodałem).

w związku z tym moje pytanie brzmi: jak skonstruować transakcję, tak aby nie było problemu z dodaniem numeru id zamówienia do pozycji tegoż zamówienia, które są w innej tabeli?




Pozdrawiam

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
zzeus
post
Post #2





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Nie wiem czy dobrze zrozumiałem o co chodzi, ale transakcja nie ogranicza się do operacji na jednej tabeli, ogólnie robisz tak:

1. transacion begin
2. dodajesz zamówienie
3. pobierasz id ostatnio dodanego zamówienia
4. dodajesz pozycje zamówienia
5. jeśli wszystko przebiegło pomyślnie robisz commit
6. jeśli gdzieś pojawił się błąd robisz rollback, dzięki któremu w bazie nie pojawią się informacje o zamówieniu i jego pozycjach


--------------------
Go to the top of the page
+Quote Post
Marq
post
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 5
Dołączył: 14.10.2008
Skąd: Tarnów

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


Tak myślałem, ale co, jeśli pomiędzy dodaniem zamówienia a pobraniem ostatniego zamówienia zostanie dodane inne zamówienie? Wtedy pobrane id ostatniego zamówienia nie będzie tym, do którego mają być przypisane pozycje...
Go to the top of the page
+Quote Post
zzeus
post
Post #4





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Będzie, bo zostanie zwrócony id ostatnio dodanego rekordu w ramach połączenia nawiązanego przez tego konkretnego użytkownika


--------------------
Go to the top of the page
+Quote Post
Marq
post
Post #5





Grupa: Zarejestrowani
Postów: 35
Pomógł: 5
Dołączył: 14.10.2008
Skąd: Tarnów

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


Ok, dzięki, martwiłem się tylko o to winksmiley.jpg
Go to the top of the page
+Quote Post
l3l0
post
Post #6





Grupa: Zarejestrowani
Postów: 94
Pomógł: 16
Dołączył: 24.07.2009
Skąd: Gdańsk

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


Cytat(Marq @ 11.09.2009, 14:13:29 ) *
Tak myślałem, ale co, jeśli pomiędzy dodaniem zamówienia a pobraniem ostatniego zamówienia zostanie dodane inne zamówienie? Wtedy pobrane id ostatniego zamówienia nie będzie tym, do którego mają być przypisane pozycje...


Witam,

Tak naprawdę zależy to od tego jaki wybierzesz poziom izolacji transakcji. INNODB w MySQL wspiera wszystkie poziomy, więc może nastąpić tzw. DIRTY READ. Jednak domyślne ustawenia (REPEATABLE READ) pozwalają Ci się tym nie martiwć - będzie tak jak pisał zzeus.
Więcej info o poziomach izolacji w mysql znajdziesz np. tutaj - żródło po angielsku.
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 Aktualny czas: 20.08.2025 - 10:00