Mamy aplikację kliencką, która działa na SQL Server 2005, na przykład:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Jest wysyłany przez jedno długie polecenie.
Jeśli jedno z wstawień nie powiedzie się lub którakolwiek część polecenia się nie powiedzie, czy SQL Server wycofuje transakcję? Jeśli nie można go wycofać, czy muszę wysłać drugie polecenie, aby je wycofać?
Mogę podać szczegóły dotyczące interfejsu API i języka, którego używam, ale wydaje mi się, że SQL Server powinien odpowiadać tak samo dla każdego języka.
sql
sql-server
sql-server-2005
transactions
jonathanpeppers
źródło
źródło
Odpowiedzi:
Możesz postawić
set xact_abort on
przed transakcją, aby upewnić się, że sql automatycznie cofa się w przypadku błędu.źródło
xact_abort
jest na poziomie połączenia.Masz rację, ponieważ cała transakcja zostanie wycofana. Powinieneś wydać polecenie, aby je wycofać.
Możesz owinąć to w
TRY CATCH
blok w następujący sposóbźródło
try
), ale kod zawiedzie później. Nie ma już transakcji, ale nadal wchodzisz wcatch
.Oto kod z otrzymywaniem komunikatu o błędzie podczas pracy z MSSQL Server 2016:
źródło
DECLARE @Var TYPE; SET @Var = ERROR;
do zgłaszania błędów na serwerze SQL 2005. W przeciwnym razie powyższy kod do zgłaszania błędów działa również dla starszych DB. Przyczyną problemu była próba przypisania wartości domyślnej do zmiennej lokalnej.Z artykułu MDSN, Kontrolowanie transakcji ( aparat bazy danych) .
W twoim przypadku spowoduje to wycofanie całej transakcji, gdy którykolwiek z wkładek zawiedzie.
źródło
Nie.
Jasne, powinieneś wydać
ROLLBACK
zamiastCOMMIT
.Jeśli chcesz zdecydować, czy chcesz zatwierdzić, czy wycofać transakcję, powinieneś usunąć
COMMIT
zdanie z wyciągu, sprawdzić wyniki wstawek, a następnie wydać albo,COMMIT
albo wROLLBACK
zależności od wyników kontroli.źródło
Named Pipes
LubTCP
) przerywa połączenie. Gdy połączenie zostanie zerwane,SQL Server
zatrzymuje wszystkie aktualnie uruchomione polecenia i wycofuje transakcję.