Jeśli nie wycofasz transakcji, zmiana będzie nadal wprowadzana?

10

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?

Josh Stevenson
źródło
Myślę, że to zależy od zachowania oprogramowania klienckiego używanego do uruchamiania tych instrukcji lub aplikacji, w której są osadzone. Niektóre mogą automatycznie zatwierdzać, jeśli skonfigurowane (SSMS zrobi to domyślnie).
mustaccio,
3
Jawnie zadeklarowane transakcje nie są automatycznie zatwierdzane. Ponieważ Josh ogłosił rozpoczęcie transakcji, zachowa się dokładnie tak, jak odpowiedział Justin Cave.
Dave

Odpowiedzi:

16

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?

Kin Shah
źródło
@JoshStevenson Myślę, że warto czytać o Operacjach Atomowych w kontekście bazy danych.
Nelz,
12

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.

Justin Cave
źródło
To jest właściwa odpowiedź. Bez tej informacji nie ma dla mnie sensu, aby używać zarówno instrukcji COMMIT, jak i ROLLBACK.
Tarec
1

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.

Mitesh bisht
źródło