Mam kilka wystąpień aplikacji J2EE uruchomionych w jednym klastrze WebLogic.Czy mogę wykonać atomową MERGE w Oracle?
W pewnym momencie aplikacje te wykonują MERGE, aby wstawić lub zaktualizować rekord do wewnętrznej bazy danych Oracle. MERGE sprawdza, czy istnieje wiersz z określonym kluczem podstawowym. Jeśli tam jest, zaktualizuj. Jeśli nie, włóż.
Załóżmy teraz, że dwie instancje aplikacji chcą wstawić lub zaktualizować wiersz z kluczem podstawowym = 100. Załóżmy, że wiersz nie istnieje. Podczas etapu "sprawdzenia" scalania oboje widzą, że nie ma tam wierszy, więc obaj próbują wstawić. Wtedy otrzymuję wyjątkowe naruszenie ograniczenia klucza.
Moje pytanie brzmi następująco: Czy w Oracle jest atomowa MERGE? Szukam czegoś, co ma podobny efekt do INSERT ... FOR UPDATE
w PL/SQL, z tym wyjątkiem, że mogę wykonywać SQL z moich aplikacji.
EDYCJA: Byłem niejasny. Używam instrukcji MERGE, gdy ten błąd nadal występuje. Rzecz w tym, że tylko część "modyfikująca" jest atomowa, a nie cała fuzja.
Scalenie jest atomowe. Działa albo nie działa jako kompletna jednostka pracy. To, co widzisz, jest wynikiem wdrożenia przez firmę Oracle spójności w zakresie konwersji wielu wersji. Wygląda na to, że szukasz czegoś, co umożliwi seralizację wielu scaleń? Możesz spróbować użyć transakcjalizowanych transakcji Oracle, ale to prawdopodobnie wystarczy zmienić błąd z unikalnego ograniczenia klucza, aby nie serializować błędu transakcji. –
Moja baza danych/wiele wątków może być błędna. Moje zrozumienie to "praca lub porażka jako kompletna jednostka pracy" nazywana jest transakcyjną. Według atomisty chodziło mi o to, aby nie doszło do scalenia, podczas gdy inne scalanie jest przetwarzane. O serializacji scaleń, będę musiał przeczytać o tym. Dzięki. – Russell
@Russell, atomowość to tylko jedna właściwość transakcji. I oznacza sukces lub porażkę jako jednostkę. Zobacz przykład: http://en.wikipedia.org/wiki/ACID i http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/transact.htm#sthref1298. –