Nie, ale możesz rozpocząć transakcję i ustawić poziom odseparowania na odczyt niezatwierdzonych . Zasadniczo robi to to samo co NOLOCK, ale zamiast robić to na podstawie tabeli, zrobi to dla wszystkiego w zakresie transakcji.
Jeśli to brzmi tak, jak chcesz, oto jak możesz to zrobić ...
//declare the transaction options
var transactionOptions = new System.Transactions.TransactionOptions();
//set it to read uncommited
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
//create the transaction scope, passing our options in
using (var transactionScope = new System.Transactions.TransactionScope(
System.Transactions.TransactionScopeOption.Required,
transactionOptions)
)
//declare our context
using (var context = new MyEntityConnection())
{
//any reads we do here will also read uncomitted data
//...
//...
//don't forget to complete the transaction scope
transactionScope.Complete();
}
Metody rozszerzające mogą to ułatwić
źródło
Jeśli potrzebujesz czegoś ogólnie, najlepszym sposobem, jaki znaleźliśmy, który jest mniej uciążliwy niż faktyczne rozpoczynanie zakresu transakcji za każdym razem, jest po prostu ustawienie domyślnego poziomu izolacji transakcji w połączeniu po utworzeniu kontekstu obiektu, uruchamiając to proste polecenie:
http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspx
Dzięki tej technice byliśmy w stanie stworzyć prostego dostawcę EF, który tworzy dla nas kontekst i faktycznie uruchamia to polecenie za każdym razem dla całego naszego kontekstu, dzięki czemu zawsze jesteśmy w stanie „czytaj niezatwierdzone”.
źródło
Transactions running at the READ UNCOMMITTED level do not issue shared locks
. Oznacza to, że musisz działać w ramach transakcji, aby uzyskać korzyść. (pobrane z msdn.microsoft.com/en-gb/library/ms173763.aspx ). Twoje podejście może być mniej inwazyjne, ale nic nie da, jeśli nie wykorzystasz transakcji.SET TRANSACTION ISOLATION LEVEL...
Komenda wpływa na właściwość Połączenie poziomie, a tym samym wpływa na wszystkie instrukcje SQL wykonane z tego punktu do przodu (do tego połączenia), chyba że zostaną zamienione przez nutą zapytania. To zachowanie występuje od co najmniej SQL Server 2000 i prawdopodobnie wcześniej.CREATE TABLE ##Test(Col1 INT); BEGIN TRAN; SELECT * FROM ##Test WITH (TABLOCK, XLOCK);
. Otworzyć kolejne zapytanie (# 2) i wykonaj:SELECT * FROM ##Test;
. SELECT nie powróci, ponieważ jest blokowany przez wciąż otwartą transakcję na karcie 1, która używa blokady na wyłączność. Anuluj WYBÓR w # 2. UruchomSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
raz w zakładce # 2. Uruchom ponownie SELECT w zakładce # 2 i wróci. Pamiętaj, aby uruchomićROLLBACK
w zakładce nr 1.Chociaż absolutnie zgodziłem się, że użycie poziomu izolacji transakcji Odczyt niezatwierdzonych jest najlepszym wyborem, ale od jakiegoś czasu zmuszony byłeś użyć wskazówki NOLOCK na prośbę menedżera lub klienta i nie zaakceptowano żadnych powodów przeciwko temu.
Za pomocą Entity Framework 6 można zaimplementować własne DbCommandInterceptor w następujący sposób:
Mając tę klasę, możesz ją zastosować na początku aplikacji:
I warunkowo wyłącz dodawanie
NOLOCK
podpowiedzi do zapytań dotyczących bieżącego wątku:źródło
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { if (!SuppressNoLock) command.CommandText = $"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;{Environment.NewLine}{command.CommandText}"; base.ReaderExecuting(command, interceptionContext); }
Ulepszanie zaakceptowanej odpowiedzi Doktora Jonesa i używanie PostSharp ;
Pierwszy „ ReadUncommitedTransactionScopeAttribute ”
Wtedy kiedy będziesz tego potrzebować,
Możliwość dodania „NOLOCK” z przechwytywaczem jest również przyjemna, ale nie będzie działać podczas łączenia się z innymi systemami baz danych, takimi jak Oracle.
źródło
Aby to obejść, tworzę widok w bazie danych i stosuję NOLOCK w zapytaniu widoku. Następnie traktuję widok jako tabelę w EF.
źródło
Wraz z wprowadzeniem EF6 firma Microsoft zaleca używanie metody BeginTransaction ().
Możesz użyć BeginTransaction zamiast TransactionScope w EF6 + i EF Core
źródło
Nie, nie do końca - Entity Framework jest w zasadzie dość ścisłą warstwą nad rzeczywistą bazą danych. Twoje zapytania są formułowane w ESQL - Entity SQL - który jest przede wszystkim ukierunkowany na Twój model encji, a ponieważ EF obsługuje wiele backendów baz danych, nie możesz tak naprawdę wysyłać „natywnego” SQL bezpośrednio do swojego zaplecza.
Wskazówka dotycząca zapytania NOLOCK jest specyficzna dla SQL Server i nie będzie działać na żadnej z innych obsługiwanych baz danych (chyba że zaimplementowały one również tę samą wskazówkę - w co mocno wątpię).
Marc
źródło
Database.ExecuteSqlCommand()
lubDbSet<T>.SqlQuery()
.(NOLOCK)
- zobacz Złe nawyki do kopania - umieszczanie NOLOCK wszędzie - NIE ZALECA SIĘ używać tego wszędzie - wręcz przeciwnie!Jedną z opcji jest użycie procedury składowanej (podobnej do rozwiązania widoku zaproponowanego przez Ryana), a następnie wykonanie procedury składowanej z EF. W ten sposób procedura składowana wykonuje brudny odczyt, podczas gdy EF po prostu przesyła wyniki.
źródło