Powiedzmy, że uruchamiam zapytanie
begin tran
update users
set name = 'Jimmy'
where name = 'john'
Jeśli NIE wycofam transakcji, czy zmiany te nadal zostaną wprowadzone, czy zgłosi błąd, czy zresztą będzie działać jak wycofanie?
sql-server
Josh Stevenson
źródło
źródło
Odpowiedzi:
Musisz zrozumieć, czym jest transakcja - jest to pojedyncza jednostka pracy. Jest WSZYSTKO lub NIC (zgodnie z właściwościami ACID ), co gwarantuje spójność bazy danych.
Zmiany zostaną wprowadzone tylko po zatwierdzeniu. Serwer SQL zapisze wszystkie zmiany w dzienniku transakcji, a po zatwierdzeniu zostaną one zahartowane w pliku danych.
Jeśli tego nie zrobisz, twoja transakcja pozostanie OTWARTA na czas nieokreślony - co możesz zobaczyć w
sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactions
lub używaćDBCC OPENTRAN
.Ponadto zainicjowałeś jawną transakcję , która powinna zostać wyraźnie zakończona instrukcją COMMIT lub ROLLBACK.
Przeczytaj także - Czy złą praktyką jest zawsze tworzenie transakcji?
źródło
Jeśli transakcja nie zostanie zatwierdzona ani wycofana, transakcja będzie istnieć przez czas nieokreślony. Będzie nadal utrzymywał swoje blokady, potencjalnie blokując inne sesje, dopóki nie zakończysz transakcji za pomocą a
commit
lub arollback
lub dopóki DBA nie przyjdzie i nie zakończy sesji (lub dopóki coś takiego jak czkawka sieci nie spowoduje połączenia). Jeśli DBA zabije sesję, domyślnie wyda wycofanie tej i wszystkich innych otwartych transakcji.źródło
Zmiany nie zostaną wprowadzone, dopóki transakcja nie zostanie zatwierdzona, wszystkie lub nic, jak wspomniano powyżej,
Powodem tego jest atomowość. Możesz sprawdzić właściwości transakcji ACID, jej podstawowe właściwości, których przestrzega system bazy danych.
źródło