Discussion:
[MS SQL] jak używać NOLOCK
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Grzegorz Danowski
2004-08-22 21:12:15 UTC
Permalink
Mam jedną długą procedurkę zamkniętą w transakcję, aktualizującą m.in. małą
tabelkę (jednorekordową) i w międzyczasie w innym połączeniu z bazą
chciałbym sprawdzić zawartość tamtej tabelki, próbuję więc:

Select * From MojaTabelka (NOLOCK)

No i mimo tego NOLOCK, QA czeka mi z wykonaniem tego selekta aż do końca
działania długiej procedury. Czy coś muszę jeszcze dodać w długiej
procedurze? Próbowałem zmienić poziom izolacji transakcji, np. na SET
TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, ale to nic nie pomogło.

Pozdrawiam
Grzegorz

Ps. A może blokowanie rekordów w MSDE 2000A działa ciut inaczej niż w pełnej
wersji SQL Servera?
Hamrol, Piotr
2004-08-23 08:01:50 UTC
Permalink
Post by Grzegorz Danowski
Mam jedną długą procedurkę zamkniętą w transakcję,
aktualizującą m.in. małą
tabelkę (jednorekordową) i w międzyczasie w innym połączeniu z bazą
Select * From MojaTabelka (NOLOCK)
No i mimo tego NOLOCK, QA czeka mi z wykonaniem tego selekta
aż do końca
działania długiej procedury. Czy coś muszę jeszcze dodać w długiej
procedurze? Próbowałem zmienić poziom izolacji transakcji, np. na SET
TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, ale to nic nie pomogło.
A gdzie ustawiasz
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
w procedurze, czy w tym dodatkowym polaczeniu?

Powinno byc ustawiane w dodatkowym polaczeniu, ktore chce odczytac
dane modyfikowane (blokowane) przez inne procesy

ph
Grzegorz Danowski
2004-08-23 08:39:03 UTC
Permalink
"Hamrol, Piotr" <***@domdata.com> wrote in message news:***@mailserver.domdata.depfa-it.com...

(...)
Post by Hamrol, Piotr
A gdzie ustawiasz
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
w procedurze, czy w tym dodatkowym polaczeniu?
Powinno byc ustawiane w dodatkowym polaczeniu, ktore chce odczytac
dane modyfikowane (blokowane) przez inne procesy
Niestety nie działa. Podaję jeszcze przykład:
1. blokowana tabelka
Create Table tblMsg(
Msg Char(30)
)
Go
Insert Into Table tblMsg Value('')
Go

2. długa procedura:
Create Procedure Dluga
As
Begin Transaction
Update
tblMsg
Set
Msg = 'ala ma kota'

Waitfor Delay '00:00:10'

Update
tblMsg
Set
Msg = 'nic'

Commit Transaction
Go

3. wywołanie długiej
Exec Dluga

4. otwarcie drugiego okna QA i próba równoległego odczytania zawartości
tblMsg:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Select * From tblMsg

Niestety, wynik zapytania w drugim oknie pojawia się dopiero po 10 sekundach
i jest to 'nic'.

Pozdrawiam
Grzegorz
Hamrol, Piotr
2004-08-23 09:24:36 UTC
Permalink
Post by Grzegorz Danowski
1. blokowana tabelka
...
...
Post by Grzegorz Danowski
3. wywołanie długiej
...
Post by Grzegorz Danowski
4. otwarcie drugiego okna QA i próba równoległego odczytania
...

na SQL Server 2000 Developer Edition SP3a
dziala bez problemu

sprawdz na jakie zasoby czeka to wiszace zapytanie
EXEC sp_lock - moze to Ci na cos naprowadzi

ph
Grzegorz Danowski
2004-08-24 05:39:47 UTC
Permalink
"Hamrol, Piotr" <***@domdata.com> wrote in message news:***@mailserver.domdata.depfa-it.com...
(...)
Post by Hamrol, Piotr
na SQL Server 2000 Developer Edition SP3a
dziala bez problemu
sprawdz na jakie zasoby czeka to wiszace zapytanie
EXEC sp_lock - moze to Ci na cos naprowadzi
Działa i u mnie. A nie działało, że w swojej wersji długiej procedury
używałem kombinacji Truncate Table i Insert a nie Update, tak jak w wysłanym
przykładzie. Przepraszam za zamieszanie - powinienem najpierw sprawdzić, czy
przykład wysyłany na grupę rzeczywiście nie działa. :-)

Pozdrawiam
Grzegorz
Vez do Han
2004-08-24 07:08:28 UTC
Permalink
Witam,
<...>
Post by Grzegorz Danowski
Działa i u mnie. A nie działało, że w swojej wersji długiej procedury
używałem kombinacji Truncate Table i Insert a nie Update, tak jak w wysłanym
<...>
A bo to DDL rwie transakcję (to na przyszłość).

Loading...