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?
Odpowiedz
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.
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.
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
To jednak nie jest czysta lektura. Raj powiedział: "Owijanie transakcji nie jest potrzebne do czystych odczytów". –
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
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.
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.
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
}
Kiedy coś zmodyfikowałeś w transakcji, możesz użyć instrukcji read, aby sprawdzić, czy operacja zaczyna działać, tuż przed zatwierdzeniem.
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.
- 1. Czy powinienem używać MSMQ lub SQL Service Broker dla transakcji?
- 2. Błąd transakcji SQL
- 3. Czy powinienem używać czcionek typograficznych?
- 4. Czy powinienem używać Universal-ctags?
- 5. Czy powinienem używać takiego constexpr?
- 6. Czy powinienem używać "ostatecznego" modyfikatora podczas tworzenia obiektów Date?
- 7. Jak powinienem używać BIT w SQL Server 2005
- 8. Czy powinienem używać funkcji PHPSRV PHP?
- 9. Numpy: Czy powinienem używać newaxis czy None?
- 10. Czy powinienem używać JDBC getNString() zamiast getString()?
- 11. Jak powinienem używać Redis jako pamięci podręcznej dla SQL Server?
- 12. Czy powinienem używać String zamiast nazwy TFilename?
- 13. Czy warto używać list asocjacyjnych zamiast rekordów?
- 14. Dlaczego powinienem używać Drools?
- 15. Czy powinienem uruchomić VACUUM w transakcji lub po?
- 16. Czy powinienem przekazać zarządzany podmiot do metody wymagającej nowej transakcji?
- 17. Sql transakcji klienta z transakcji kodu vs transakcji bazy danych
- 18. Kiedy powinienem potwierdzić przyjęcie transakcji zakupu aplikacji?
- 19. Czy powinienem używać metody `readinto` z pliku Pythona, czy nie?
- 20. Czy powinienem używać System.out.println() lub czegoś innego?
- 21. Czy naprawdę powinienem używać kluczy obcych?
- 22. Czy powinienem używać odbiornika lub obserwatora?
- 23. Android - Czy powinienem nadal używać PreferenceActivity?
- 24. Czy powinienem używać __restrict na referencjach?
- 25. czy powinienem używać urandom lub openssl_random_pseudo_bytes?
- 26. Czy powinienem używać nav lub ul
- 27. ExtJS 6: Czy powinienem używać obiektu config?
- 28. Czy powinienem używać dziedziczenia lub kompozycji?
- 29. Czy powinienem używać autoboxa w Perlu?
- 30. Animacja GMSGroundOverlay - czy powinienem używać opcji CATiledLayer?
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