2010-06-21 8 views
7

Transakcje SQL są używane do wstawiania, aktualizacji, ale czy powinny być używane do odczytu rekordów?Czy powinienem używać transakcji SQL podczas odczytu rekordów?

+0

dziękuję wszystkim odbierającym, chciałbym mieć możliwość zaznaczenia wszystkich jako odpowiedzi, ale nie ma. dziękuję za podanie przykładów, za podanie linku do wyjaśnienia blokady, wyjaśnienie, jak uzyskać aktualne dane w milisekundach dziękuję. – user287745

Odpowiedz

8

Jeśli wyszukujesz wszystkie rekordy w jednym zapytaniu i cofasz je za jednym razem, nie ma takiej potrzeby. Wszystko jest zawinięte w niejawną transakcję. To znaczy, nawet jeśli otrzymasz z powrotem milion rekordów, a nawet jeśli inne procesy zmieniają zapisy, zobaczysz, jak wyglądały wszystkie miliony rekordów w tym samym momencie.

Jedynym momentem, w którym naprawdę potrzebna jest transakcja (i często specjalna wskazówka blokująca) w procesie tylko do odczytu, to:
- Czytasz zapisy "kawałkowy posiłek" i nie potrzebujesz niczego zmieniać wartości podczas gdy ty iterujesz. [Tak jak połączony zestaw rekordów w ADO, który następnie przesuwasz kursorem.]
- Odczytujesz niektóre dane, wykonujesz obliczenia, a następnie czytasz niektóre powiązane dane, ale przy założeniu nic się nie zmieniło w międzyczasie.


Krótko mówiąc, trzeba transakcji, jeśli chcesz inne procesy być zatrzymany zakłócaniu danych między SQL.

3

Owijanie transakcji nie jest potrzebne do czystych odczytów.

W ramach instrukcji SQL, Wskazówki dotyczące blokad powinny zachować ostrożność, zwracając odpowiednie dane (http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx).

Na poziomie serwera można ustawić poziomy izolacji transakcji (http://msdn.microsoft.com/en-us/library/ms173763.aspx).

Edit

Wyjaśniając czysty czyta

Jeśli wszystko oświadczenie Twój SQL ma następujące rodzaje odczytuje wtedy nie trzeba zawinąć w transakcji

SELECT Col1, Col2 
From Table1 
    INNER JOIN Table2 
     ON Table1.Id = Table2.Table1Id 

Jeśli czytasz wyników na które mogą wpływać inne transakcje równolegle, musisz zawrzeć transakcję. Na przykład:

BEGIN TRANSACTION 

INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21) 
UPDATE AccountSummary SET Balance = Balance + 43.21 

SELECT @Balance = Balance FROM AccountSummary 

COMMIT TRANSACTION 

Rzeczywiście, po prostu zwracasz saldo, ale cała transakcja pieniężna musi działać w dwóch miejscach.

+0

W poniższym przykładzie każdy współbieżny proces może zakłócać odczytane tabele. Nie ma zapisu danych, ale istnieją obliczenia między podobnymi odczytami. Jako taka TRANSAKCJA musiałaby chronić stan danych. INSERT INTO @temp SELECT ; ; WYBIERZ ; – MatBailie

+0

To jednak nie jest czysta lektura. Raj powiedział: "Owijanie transakcji nie jest potrzebne do czystych odczytów". –

+0

Zdefiniuj "czysty odczyt", przykład, który podałem, nie wstawia, nie aktualizuje ani nie usuwa niczego poza zmienną. [Może to być INT, zmienna tabeli lub inny kontener danych w celu ułatwienia obliczeń, które następnie definiują zachowanie końcowego odczytu] – MatBailie

2

Jeśli potrzebujesz najbardziej aktualnej informacji w milisekundach, możesz użyć transakcji skonstruowanej przy użyciu TransactionOptions o wartości IsolationLevel z Serializable.

Wpływa to na wydajność, ponieważ spowoduje zablokowanie stołu (lub jego części), więc musisz się dowiedzieć, czy naprawdę tego potrzebujesz.

Dla większości zastosowań, jeśli robisz odczyt, nie musisz zawijać transakcji wokół niego (zakładając, że czytasz tylko w jednej operacji).

To naprawdę zależy od twojej aplikacji, jakich danych potrzebuje i jak jej używa.

Na przykład, jeśli czytasz i zależy od wyników, które robisz, zapisuj lub aktualizuj, ale ważne jest, aby dane, które właśnie przeczytałeś, były aktualne, prawdopodobnie powinieneś zawrzeć całą logikę w pojedynczej transakcji.

1

Nie, transakcje nie są zwykle potrzebne do odczytu danych i spowolnią odczyt danych.

Proponuję, abyś przeczytał termin ATOMIC. Pomoże Ci to zrozumieć, jakie transakcje są przeznaczone.

1

Możliwe jest dokonywanie transakcji, ale jaki jest tego cel?

Można ustawić odpowiedni poziom izolacji dla całej sesji SQL Server za pomocą instrukcji SET TRANSACTION ISOLATION LEVEL.

To składnia z SQL Server Books Online:

SET TRANSACTION ISOLATION LEVEL 
    { 
     READ COMMITTED 
     | READ UNCOMMITTED 
     | REPEATABLE READ 
     | SERIALIZABLE 
    } 

Locking in Microsoft SQL Server.

0

Kiedy coś zmodyfikowałeś w transakcji, możesz użyć instrukcji read, aby sprawdzić, czy operacja zaczyna działać, tuż przed zatwierdzeniem.

0

Transakcje mają na celu uniknięcie problemów związanych z współbieżnością, gdy jedna transakcja logiczna jest mapowana na kilka zapytań SQL. Na przykład, w przypadku konta bankowego, jeśli przenosisz pieniądze z jednego konta na drugie, odejmiesz kwotę od konta, a następnie dodasz ją do innej (lub odwrotnie). Jeśli jednak wystąpi błąd pomiędzy bazą danych, będzie to stan nieprawidłowy (być może odjęto kwotę z jednego konta, ale nie dodałem go do innego). Tak więc, jeśli czytasz wszystkie swoje dane w jednym zapytaniu, nie potrzebujesz transakcji.

Powiązane problemy