Jak radzić sobie z równoczesnymi aktualizacjami w bazach danych?

Jaki jest powszechny sposób radzenia sobie z równoczesnymi aktualizacjami w bazie danych SQL?

Rozważmy prosty schemat SQL (ograniczenia i wartości domyślne nie pokazane ..)

create table credits (
  int id,
  int creds,
  int user_id
);

Intencją jest przechowywanie pewnego rodzaju kredytów dla użytkownika, np. coś w rodzaju reputacji stackoverflow.

Jak radzić sobie z równoczesnymi aktualizacjami tej tabeli? Kilka opcji:

update credits set creds= 150 where userid = 1;

W tym przypadku aplikacja pobrała bieżącą wartość, obliczyła nową wartość (150) i przeprowadziła aktualizację. Co oznacza katastrofę, jeśli ktoś inny zrobi to samo w tym samym czasie. Zgaduję, że zawijanie wartości bieżącej i aktualizacja w transakcji rozwiązałoby to, np.Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end; W tym przypadku możesz sprawdzić, czy nowy kredyt będzie <0 i po prostu skrócić go do 0, jeśli ujemne kredyty nie mają sensu.

update credits set creds = creds - 150 where userid=1;

Ten przypadek nie musiałby martwić się o równoczesne aktualizacje, ponieważ DB zajmuje się problemem spójności, ale ma wadę, że kredyty chętnie stałyby się ujemne, co może nie mieć sensu dla niektórych aplikacji.

Po prostu, jaka jest przyjęta metoda radzenia sobie z (dość prostym) problemem opisanym powyżej, a jeśli db wyśle ​​błąd?

questionAnswers(9)

yourAnswerToTheQuestion