Myślę, że próbujesz rozwiązać problem w niewłaściwy sposób. To, czego chcesz, to najwyższa ochrona spójności bazy danych. Jeśli dwie osoby jednocześnie uruchamiają procedurę składowaną, spójność bazy danych może zostać naruszona.
Aby zabezpieczyć się przed różnego rodzaju niespójnościami w bazie danych, standard SQL ma cztery poziomy izolacji transakcji:
- PRZECZYTAJ NIEDOPUSZCZONE, gdy transakcje zasadniczo tracą na wartości, a inne transakcje zawierają brudne dane. Nie używaj tego!
- PRZECZYTAJ ZOBOWIĄZANE, gdy transakcje widzą tylko zatwierdzone dane, ale mogą występować niespójności, w których dwie transakcje mogą przekraczać się nawzajem
- POWTARZALNE CZYTANIE, w którym rozwiązany jest jeden rodzaj niespójności, powtarzanie odczytu
- SERIALIZABLE, który gwarantuje, że istnieje pewne wirtualne zamówienie, w którym wykonanie transakcji doprowadziłoby do rezultatów, których rezultatem była ich realizacja
Jednak standard SQL ma podejście oparte na blokowaniu tych niespójności z bazami danych, a ze względu na wydajność wiele baz danych stosuje podejście oparte na izolacji migawek, które zasadniczo ma następujące poziomy:
- PRZECZYTAJ ZAKOŃCZONO, czyli to samo, co w blokowanych bazach danych
- SNAPSHOT ISOLATION, gdzie baza danych widzi migawkę wszystkich danych, a jeśli spróbuje zaktualizować wiersz, który został zaktualizowany przez inną transakcję, zostanie anulowana, ale istnieją pewne dobrze znane anomalie, które mogą mieć miejsce
- SERIALIZABLE, który jest taki sam, jak w bazach danych opartych na blokowaniu, ale tym razem zaimplementowany w inny sposób, nie poprzez podejmowanie blokad, ale przez zapewnienie, że nie występują naruszenia serializacji, a jeśli takie naruszenie zostanie wykryte, anulowanie transakcji
Anulowanie transakcji w tych bazach danych opartych na izolacji migawek może wydawać się niepokojące, ale znowu każda baza danych anuluje transakcję z powodu impasu, więc każda rozsądna aplikacja i tak musi móc ponownie spróbować przeprowadzić transakcję.
Co chcesz jest SERIALIZABLE poziom izolacji: zapewnia, że jeśli transakcje wykonywane niezależnie jeden po drugim wynikiem w stanie dobrym, każda równoległa realizacja transakcji powoduje również stan dobry. Na szczęście Michael Cahill w swojej rozprawie doktorskiej dowiedział się, w jaki sposób SERIALIZABLE poziom izolacji może być obsługiwany przez migawkowe izolowane bazy danych przy niewielkim wysiłku.
Jeśli używasz poziomu izolacji SERIALIZABLE w izolowanej bazie danych migawek, jeśli dwie osoby spróbują uruchomić procedurę składowaną jednocześnie i staną sobie na palcach, jedna z transakcji zostanie anulowana.
Czy SQL Server rzeczywiście obsługuje poziom izolacji SERIALIZABLE (zamiast maskaradowej izolacji migawki za słowem kluczowym SERIALIZABLE )? Szczerze mówiąc, nie wiem: jedyną znaną bazą danych, która ją obsługuje, jest PostgreSQL.
Mimo że nie udzieliłem porady SQL Serverowi, nadal zamieszczam tę odpowiedź, ponieważ użytkownicy PostgreSQL i użytkownicy innych baz danych, którzy mogą rozważyć przejście na PostgreSQL, mogą skorzystać z mojej odpowiedzi. Ponadto użytkownicy baz danych innych niż PostgreSQL, którzy nie mogą przełączyć się na PostgreSQL, mogą wywierać presję na swojego ulubionego dostawcę bazy danych, aby zaoferował autentyczny SERIALIZABLE poziom izolacji.