2011-02-04 5 views

Odpowiedz

95

Dopóki nie COMMIT lub ROLLBACK transakcję, to nadal „działa” i potencjalnie posiadających zamki.

Jeśli twój klient (aplikacja lub użytkownik) zamknie połączenie z bazą danych, wszystkie nadal aktywne transakcje zostaną wycofane i zakończone.

+1

mmm, ok Rozumiem, że to tworzyło jakąś blokadę. Nie byłam pewna, czy zamknięcie połączenia rzeczywiście doprowadzi mnie do tego stanu. Problem polegał na tym, że podczas próby popełnienia błędu pojawił się błąd. teraz zamknąłem połączenie i wszystko działało. – Charbel

+9

Uwaga boczna: Jeśli używasz Management Studio, zamknięcie okna zapytania spowoduje zamknięcie połączenia. –

+0

Czy ponowne uruchomienie serwera (z powodu utraty mocy) również spowoduje wycofanie? – BradleyDotNET

2

zależy od poziomu izolacji nadchodzącej transakcji.

Sql transaction isolation explained

+2

Zachowanie transakcji nie zależy od poziomu izolacji. Ilość blokad, które mogą powodować. –

+0

Jestem pewien, że dane, które można odczytać przez połączenie, są zdecydowanie zależne od poziomu izolacji. Jeśli masz zestaw izolacyjny READ UNCOMMITTED, możesz odczytywać dane, które jeszcze nie zostały zatwierdzone i mogą w rzeczywistości zostać wycofane w pewnym momencie ścieżki, ale to gwarantuje, że nie ma blokady. Jeśli masz READ COMMITTED jako poziom izolacji, nie możesz odczytać niezatwierdzonych wierszy - drugi klient zawiesi się, chyba że użyjesz SNAPSHOT. – Xhalent

9

Transakcje mają całkowicie lub w ogóle uruchomić. Jedynym sposobem zakończenia transakcji jest zatwierdzenie, każda inna metoda spowoduje wycofanie.

Dlatego, jeśli zaczniesz, a potem się nie zatwierdzisz, zostanie ono wycofane po zamknięciu połączenia (ponieważ transakcja została zerwana bez oznaczenia jako zakończona).

1

Po otwarciu transakcji nic nie zostanie zablokowane samodzielnie. Ale jeśli wykonasz niektóre zapytania wewnątrz transakcji, w zależności od poziomu izolacji, niektóre wiersze, tabele lub strony zostaną zablokowane, co wpłynie na inne zapytania, które próbują uzyskać do nich dostęp z innych transakcji.

24

Możesz spróbować samemu, co powinno pomóc Ci zorientować się, jak to działa.

Otwórz dwa okna (zakładki) w studio zarządzania, każdy z nich będzie miał własne połączenie z sql.

Teraz możesz rozpocząć transakcję w jednym oknie, zrobić rzeczy takie jak insert/update/delete, ale jeszcze nie commit. 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 czasu zatwierdzenia pierwszego okna lub możesz (nie) zobaczyć, co do tej pory zrobiła inna transakcja, itp.

Zabawa z różnymi poziomami izolacji i bez blokady podpowiedź, aby zobaczyć, jak wpływają one na wyniki.

Zobacz również, co się dzieje, gdy rzucisz błąd w transakcji.

Bardzo ważne jest, aby zrozumieć, jak te wszystkie rzeczy działają lub będziesz zaskoczony tym, co robi sql, wiele razy.

Miłej zabawy! GJ.

0

Oprócz potencjalnych problemów z blokowaniem możesz również spowodować, że dzienniki transakcji zaczną rosnąć, ponieważ nie będą mogły zostać obcięte poza minimalną wartość LSN dla aktywnej transakcji i jeśli korzystasz z izolacji migawki, przechowuj wersję w tempdb będzie rósł z podobnych powodów.

Możesz użyć dbcc opentran, aby zobaczyć szczegóły najstarszej otwartej transakcji.

-4

zachowanie nie jest zdefiniowane, więc trzeba wyraźny zestaw commit lub rollback:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

„Jeśli auto-commit tryb jest wyłączony i zamknąć połączenie bez wyraźnego popełnienia lub skręcania cofnij ostatnie zmiany, a następnie wykonywana jest niejawna operacja COMMIT. "

hsqldb sprawia, rollBack

con.setAutoCommit(false); 
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')"); 
con.close(); 

rezultacie

2011-11-14 14: 20: 22519 informacji o [SqlAutoCommitExample: 55] [AutoCommit włączony = false] 2011 -11-14 14: 20: 22.546 główne INFO [SqlAutoCommitExample: 65] [Znaleziono 0 # użytkowników w bazie danych]

+2

To może być prawdą dla Oracle (nie mam pojęcia), ale pytający pyta o MS-SQL – PaulG

+0

Pierwsza oferta dotyczy sterownika JDBC, a nie serwera. – djechlin

1

Przykład Transakcji

rozpocząć Tran TT

swoje SQL

jeśli błąd wystąpił wycofywania tran tt innego popełnić tran tt

Dopóki nie zostały zrealizowane popełnić Tran tt, dane nie zostaną zmienione

+1

Należy zauważyć, że transakcje nazywania są nie tylko niepotrzebne w MS SQL, ale mogą dać fałszywe poczucie kontroli. 'BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y' nie działa, na przykład. Zobacz http://stackoverflow.com/questions/1273376/sql-server-2005-why-name-transactions –

0

Wszelkie nie zakontraktowane transakcje zostawi rver 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ń.

Powiązane problemy