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?
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?
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.
Jeśli nie wycofam transakcji, czy zmiany te zostaną wprowadzone
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_transactionslub 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?
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 commitlub a rollbacklub 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.
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.