Załóżmy, że mam zapytanie:
begin tran
-- some other sql code
A potem zapominam o zatwierdzeniu lub wycofaniu.
Co się stanie, jeśli inny klient spróbuje wykonać zapytanie?
sql-server
transactions
commit
Charbela
źródło
źródło
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.
źródło
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).
źródło
zależy od poziomu izolacji transakcji przychodzącej.
Wyjaśnienie izolacji transakcji SQL
źródło
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.
źródło
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
źródło
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.źródło
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ń.
źródło
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
Hsqldb dokonuje wycofania
wynik jest
źródło