Transakcje, inkrementacja i MySQL UPDATE

Autor:kasia k cik z ksi k

Czy operacja przyrostowa w wersji UPDATE jest bezpieczna transakcyjnie w MySQL? Czy można ścigać się, gdy wielu klientów jednocześnie wykonuje zapytanie typu "UPDATE mytable SET myfield = myfield + 1 WHERE id = myid"? Jeśli tysiąc klientów jednocześnie wykona takie zapytanie w wierszu z wartością podstawową równą 0, czy wartość będzie na końcu tysiąca?

Mowa o InnoDB.

Odpowiedzi

tinab48
В InnoDB блокируется строка, не должно быть ахтунга.
lala44
Да, будет равно имеено 1000 в конце. независимо от движка. В разных движках это обеспечивается по разному. Нампример в innodb блокиоровкой конкретной записи. В Myisam — блокировкой всей таблицы на короткое время.
george marzen
Не вижу ни одной причины сказать «не будет». Иначе просто теряется смысл реляционной СУБД.
Odpowiedzi:
Prawdopodobnie chciałeś powiedzieć "Znaczenie transakcji jest stracone" - art rs
Tak, nie tylko transakcje. W transakcjach MyISAM na przykład nie. Ale są blokady, ipc i wszystko inne.

Po co cały ten ogród, jeśli taka prosta rzecz nie zadziałałaby. - ms bayer
jannis
Запись приведенная вами, абсолютно транзакционно безопасна. Строка блокируется, изменяется, разблокируется.
nikolay
Посмотрите принцип действия update.
Запись блокируется, выполняется update и потом дальше можно только работать с этой записью. В принципе из-за этого, в некоторых статьях по оптимизации и уменьшению нагрузки на сервер, рекомендуют не использовать часто update
Odpowiedzi:
A jeśli w jednej transakcji najpierw otrzymasz wartość poprzez WYBIERZ ... NA AKTUALIZACJĘ, a następnie dokonasz bezpośredniej AKTUALIZACJI następnej wartości? - diana mendez
Och, nie ma go tutaj :) - slynne
barry benteman
Далеко не факт, что значение будет 1000, особенно учитывая тот факт, что в InnoDB применяется MVCC Учитывая это при одновременном выполнении 1000 запросов, каждый из них будет увеличивать значение с нуля до единицы.
Odpowiedzi:
A jeśli w jednej transakcji najpierw otrzymasz wartość poprzez WYBIERZ ... NA AKTUALIZACJĘ, a następnie dokonasz bezpośredniej AKTUALIZACJI następnej wartości? - tyler wilson
Odrębna "kopia" tabeli jest tworzona dla każdej transakcji. Jeśli uruchomimy jedną transakcję, która zwiększy wartość od zera do jednej i równolegle z nią, to zwróci 0, aby wybrać - lindsay hunter
Jeśli twoja transakcja zapisuje niektóre dane do rekordu, żadna inna transakcja w innodb nie może tam pisać. Nagraj zablokowane. Możesz czytać stamtąd (w zależności od poziomu izolacji) i pisać - to nie zadziała, nowa transakcja będzie czekać na wydanie płyty. Jeśli rekord nie zostanie zwolniony przez dłuższy czas, nowa transakcja zostanie po prostu przerwana z błędem ERROR 1205 (HY000): przekroczono limit czasu oczekiwania na blokadę; spróbuj ponownie uruchomić transakcję - dila hanim
Tworzenie urządzenia na podstawie papieru elektronicznego :: Doradztwo w zakresie marketingu IT :: Doradztwo w zakresie programowania funkcjonalnego :: Tunelowanie za pośrednictwem serwera proxy HTTP :: Konto bez długiej aktywności - aby usunąć lub nie usunąć?
Zostaw odpowiedź
Linki