![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witam,
czy Doctrine (póki co 1.2) obsługuje zmianę wartości pól w stylu: stan_magazynowy = stan_magazynowy + 10 W tej chwili robię:
Wadą tego rozwiązania jest to, że obiekt PO ZAPISANIU zamiast aktualnej wartości liczbowej w polu stan_magazynowy posiada to co przypisałem, czyli Doctrine_Expression('stan_magazynowy + 10') "Odświeżam" ponownie obiekt ręcznie ale zastanawiam się, czy ktoś nie wymyślił jakiegoś bardziej eleganckiego i automatycznego rozwiązania Ten post edytował zordon 29.02.2012, 14:09:50 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli $row to obiekt-encja to dla czego nie zrobisz po prostu $row->stan_magazynowy += 10;?
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
bo w przypadku gdy 2 użytkowników zechce pobrać towar z magazynu w idealnie tej samej chwili poleca do bazy 2 zapytania, ktore "nadpiszą" się nawzajem.
np początkowy stan: 10 user 1 zabiera 1 szt, user 2 zabiera 2 szt łącznie zabierają 3 szt. Do bazy przy dużym ruchu mogą pójść zapytania:
stan magazynu po zakończeniu obu transakcji: 8, a powinno być 7 W przypadku
będzie ok Ten post edytował zordon 1.03.2012, 14:51:14 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Słowo klucz: transakcje (ale takie w bazie danych) i poziomy transakcji.
Cytat W takim czymś problem jest dokładnie taki sam.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
używam transakcji w tabelach innodb i rozwiązanie stan_magazynowy=stan_magazynowy-x wciąż wydaje mi się lepsze.
W transakcji rekordy nie mogą nadpisywać tych samych rekordów, ale mogą je czytać, czyli w zapisie "stan_magazynowy=x" problem pozostaje. W rozwiązaniu "stan_magazynowy=stan_magazynowy-x" najgorsze, co może się stać to "wyjechanie" ze stanem magazynowym poniżej zera, ale to można obsłużyć już po zakończeniu transakcji (np cofając problematyczne zamówienie już po zakończeniu transakcji). Wiem, że można zablokować rekordy również do odczytu ale tego tematu nie znam zbyt dobrze. Z tego co kojarzę to odczyt zablokowanego rekordu przez inną transakcję spowoduje wystąpienie błędu, a nie o to przecież chodzi. Mógłbyś rozwinąć trochę temat i podać najlepszą praktykę rozwiązania tego typu problemu? |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Upewnij się, że masz wyłączony autocommit.
2. PDO jak zwykle nie popisało się swoimi możliwościami - poziomu izolacji transakcji nie ustawisz za jego pomocą. 3. Musisz więc ręcznie to zrobić, np. w przypadku MySQL: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html bądź PostgreSQL: http://www.postgresql.org/docs/9.1/static/...ransaction.html 4. Poziom, który Ciebie interesuje to co najmniej READ COMMITTED. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
READ COMMITED + FOR UPDATE w select
dzięki za pomoc! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 06:48 |