![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 30.04.2006 Ostrzeżenie: (10%) ![]() ![]() |
Przypuscmy, ze mam skrypt, ktory wykonuje dana operacje w bazie danych, a po tym zapisuje sobie gdzies, ze juz to zrobil i za drugim wykonaniem juz nie bedzie wykonywal tej operacji.
Gdyby wywolac ten skrypt dwukrotnie dokladnie w tym samym czasie ( a jest to mozliwe, jesli sie ma na stronie kilkaset tysiecy uzytkownikow ) to wedlug mojej teorii ta operacja zostanie wykonana dwukrotnie. Zgadzacie sie z tym? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jesli tak jest to jak sie przed tym chronic? Ten post edytował Amarel 30.03.2009, 19:32:04 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 122 Pomógł: 8 Dołączył: 20.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Przypuscmy, ze mam skrypt, ktory wykonuje dana operacje w bazie danych, a po tym zapisuje sobie gdzies, ze juz to zrobil i za drugim wykonaniem juz nie bedzie wykonywal tej operacji. Rozumiem, że robisz coś takiego? 1) BEGIN 2) SELECT * FROM wykonane_operacje WHERE operacja = ? 3) wykonanie operacji, jakieś zapisy do różnych tabel itp 4) INSERT (operacja, ..., ...) VALUES (1, ?, ?) INTO wykonane_operacje 5) COMMIT Rozwiązania: 1) W tabeli, w której zapisujesz tę informacje (wykonane_opeacje) załóż unique na kolumnę (lub kolumny) które identyfikują (w tym przypadku kolumna operacja) to, że dana operacja została już zrobiona. W ten sposób baza danych nie dopuści do zapisania drugi raz tej samej operacji (przy próbie inserta). 2) Zakładanie locka na tabelę wykonane_operacje - między punktem 1 i 2. W ten sposób SELECT z innego skryptu będzie mógł być dopiero wykonany w momencie zwolniania locka (czyli punkt 5). Może spowodować niestety spowolnienie działania całego systemu z powodu oczekiwania na zwalnianie locków! P.S Nie znam Mysql, ale myślę że takie rzeczy tam są. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.10.2025 - 05:37 |