Odpowiedzi:
Dopóki nie ZATWIERDZISZ ani nie ROLLBACK transakcji, jest ona nadal „uruchomiona” i potencjalnie zawiera blokady.
Jeśli klient (aplikacja lub użytkownik) zamknie połączenie z bazą danych przed zatwierdzeniem, wszelkie nadal działające transakcje zostaną wycofane i zakończone.
Możesz tego spróbować samemu, co powinno pomóc ci poczuć, jak to działa.
Otwórz dwa okna (zakładki) w Management Studio, każde z nich będzie miało własne połączenie z sql.
Teraz możesz rozpocząć transakcję w jednym oknie, zrobić coś takiego jak wstawianie / aktualizowanie / usuwanie, ale jeszcze nie zatwierdzać. następnie w drugim oknie możesz zobaczyć, jak wygląda baza danych spoza transakcji. W zależności od poziomu izolacji tabela może być zablokowana do momentu zatwierdzenia pierwszego okna lub możesz (nie) zobaczyć, co zrobiła do tej pory inna transakcja itp.
Baw się różnymi poziomami izolacji i nie wyświetlaj podpowiedzi, aby zobaczyć, jak wpływają one na wyniki.
Zobacz także, co się stanie, gdy wyrzucisz błąd w transakcji.
Bardzo ważne jest, aby zrozumieć, jak to wszystko działa, w przeciwnym razie niejednokrotnie będziesz zaskoczony tym, co robi sql.
Baw się dobrze! GJ.
Transakcje mają przebiegać całkowicie lub wcale. Jedynym sposobem zakończenia transakcji jest zatwierdzenie, każdy inny sposób spowoduje wycofanie.
Dlatego jeśli rozpoczniesz, a następnie nie zatwierdzisz, zostanie wycofana po zamknięciu połączenia (ponieważ transakcja została zerwana bez oznaczenia jako zakończona).
zależy od poziomu izolacji transakcji przychodzącej.
Kiedy otwierasz transakcję, nic samo się nie blokuje. Ale jeśli wykonasz jakieś zapytania wewnątrz tej transakcji, w zależności od poziomu izolacji, niektóre wiersze, tabele lub strony zostaną zablokowane, więc wpłynie to na inne zapytania, które próbują uzyskać do nich dostęp z innych transakcji.
Przykład transakcji
rozpocznij tran t
Twoje instrukcje sql
jeśli wystąpił błąd rollback tran tt else commit tran tt
Dopóki nie wykonałeś commita trans tt, dane nie zostaną zmienione
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
na przykład nie działa. Zobacz stackoverflow.com/questions/1273376/…
Oprócz potencjalnych problemów z blokowaniem, które możesz spowodować, zauważysz również, że dzienniki transakcji zaczynają rosnąć, ponieważ nie można ich obciąć poza minimalną wartość LSN dla aktywnej transakcji, a jeśli używasz izolacji migawki, Twój magazyn wersji w tempdb będzie się powiększał podobne powody.
Możesz użyć, dbcc opentran
aby zobaczyć szczegóły najstarszej otwartej transakcji.
Każda niezakończona transakcja pozostawi serwer zablokowany, a inne zapytania nie będą wykonywane na serwerze. Musisz albo wycofać transakcję, albo ją zatwierdzić. Zamknięcie SSMS spowoduje również zakończenie transakcji, co pozwoli na wykonanie innych zapytań.
Zachowanie nie jest zdefiniowane, więc musisz jawnie ustawić zatwierdzenie lub wycofanie:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
„Jeśli tryb automatycznego zatwierdzania jest wyłączony i połączenie zostanie zamknięte bez jawnego zatwierdzania lub cofania ostatnich zmian, wykonywana jest niejawna operacja COMMIT”.
Hsqldb dokonuje wycofania
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
wynik jest
2011-11-14 14: 20: 22,519 główne INFO [SqlAutoCommitExample: 55] [AutoCommit włączone = false] 2011-11-14 14: 20: 22,546 główne INFO [SqlAutoCommitExample: 65] [Znaleziono 0 # użytkowników w bazie danych]