Częstym nieco logiki programowania znajdę się wdrożenie często jest czymś poniższym pseudo-kod:Synchronizacja bazy danych Access w Ukazuje App
Let X = some value
Let Database = some external Database handle
if !Database.contains(X):
SomeCalculation()
Database.insert(X)
Jednak w wielowątkowym programie mamy sytuacji wyścigu tutaj. Wątek A może sprawdzić, czy X
jest w Database
, znaleźć, że nie jest, a następnie przejść do wywołania SomeCalculation()
. W międzyczasie wątek B sprawdzi także, czy X
znajduje się w Database
, że nie jest i wstawi zduplikowany wpis.
Tak oczywiście, to musi być zsynchronizowane jak:
Let X = some value
Let Database = some external Database handle
LockMutex()
if !Database.contains(X):
SomeCalculation()
Database.insert(X)
UnlockMutex()
To jest w porządku, z wyjątkiem tego, co w przypadku gdy wniosek jest rozproszoną aplikację, działa na wielu komputerach, z których wszystkie są połączone z tym samym Back koniec maszyny bazy danych? W tym przypadku Mutex jest bezużyteczny, ponieważ synchronizuje tylko jedno wystąpienie aplikacji z innymi lokalnymi wątkami. Aby to zadziałało, potrzebowalibyśmy jakiejś "globalnej" techniki rozproszonej synchronizacji. (Załóżmy, że proste blokowanie duplikatów w Database
nie jest wykonalną strategią.)
Jakie są praktyczne rozwiązania tego problemu?
uświadamiam sobie to pytanie jest bardzo generic, ale nie chcę, aby to pytanie język specyficzny, ponieważ jest to problem, który pojawia się w wielu językach i wielu technologii baz danych.
Celowo uniknąłem określenia, czy mówię o RDBMS lub bazie danych SQL, w przeciwieństwie do czegoś takiego jak baza danych NoSQL, ponieważ znowu - szukam ogólnych odpowiedzi w oparciu o praktyki w branży. Na przykład, czy jest to sytuacja, którą może rozwiązać Atomic Stored Procedures? Lub transakcje atomowe? Czy jest to coś, co wymaga czegoś w rodzaju "Distributed Mutex"? Lub bardziej ogólnie, czy problem ten jest zazwyczaj rozwiązywany przez system baz danych, czy jest to coś, co powinna poradzić sobie sama Aplikacja?
Jeśli okaże się, że to jest niemożliwe, aby odpowiedzieć w ogóle bez dodatkowych informacji, proszę powiedz mi, że mogę go zmodyfikować.