» »

MSSQL row lock

MSSQL row lock

inferno666 ::

S problemom se ukvarjam že par dni, pa nisem odkril neke dobre rešitve:

Imam tabelo, do katero bi rad dostopal istočasno, simultano z n različnimi aplikacijami.
Aplikacija bi dobila SELECT TOP 100 podakov iz baze,
ki bi jih potem obdelovala, in na koncu zbrisala.
Druga aplikacija bi pravtako naredila isto. Problem pa je, da če prva aplikacija še ni zaključila brisanja, potem druga aplikacija z SELECT TOP 100 dobil iste podatke kot prva.

Rad bi, da druga aplikacija dobil naslednjih 100 (od 101 - 200) zapis.

Mi lahko nekdo sugerira, kako se da to rešiti.

borchi ::

pa delaš vse v transakciji?
l'jga

AndrejS ::

Zakaj pa ne narediš 3 aplikacij raje (ali eno aplikacijo z 3 nitmi). Prva jemlje podatke iz baze in da vsaki 1/2 le-teh za obdelavo ?

Zgodovina sprememb…

  • spremenil: AndrejS ()

inferno666 ::

Problem je, da želim, da bi lahko zagnal aplikacijo v teoriji n-krat. Aplikacije so neodvisne. Tako da več niti je možnost ,samo vseeno ne reši težave.

Transakcije mi tudi ne pomagajo pri tem. Z njimi rešim le konsistenstnost, še vedno pa ne znam rešiti, da obdelujem več podatkov na enkrat.

Oz. kako bi lahko naredil lock znotraj ene transakcije, tako da druga transakcija pri SELECT vrnila zapise, ki jih prva transakcija ni lockala. Tuste, ki pa jih je pa ne bi.

Raw ::

Lohk nardiš "ročni lock" - označiš prebrane zapise, kot prebrane (dodaš eno boolean polje). V vsakem selectu aplikacije pa seveda "prebrane" izločiš.
I am what I am and I do what I can

inferno666 ::

Ni mi jasno, zakaj ko zaženem dve aplikaciji eno za drugo. Prva vrednosti nastavi, vendar pri drugi select še vedno vrne stare zapise.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

SELECT TOP 10000 * FROM TTT ORDER BY ID;

UPDATE TTT WITH(ROWLOCK) SET Deleted = 1 WHERE ID IN (SELECT TOP 10000 ID FROM TTT ORDER BY ID);

COMMIT TRANSACTION;

Raw ::

ce prav razumem ti manjka 'where'.. torej neki v smislu:

SELECT TOP 10000 * FROM TTT WHERE Deleted = 0 ORDER BY ID;
I am what I am and I do what I can

inferno666 ::

Pardon sem staro kodo napisal. Tudi če dam where zraven, ne deluje.

borchi ::

ne, ne, ne... :)


uporabi hint UPDLOCK v kombinaciji z READPAST.

begin tran

select top 100 *
from BLABLA with (UPDLOCK, READPAST)

commit tran
l'jga

inferno666 ::

Hvala borchi. Sedaj deluje. Priznam, da me locking hints še malo matrajo.



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Problem v Accessu

Oddelek: Programska oprema
8818 (732) poweroff
»

random funkcija access

Oddelek: Programiranje
101309 (1174) ToniT
»

ASP problemček (MDB)

Oddelek: Izdelava spletišč
6940 (861) AndrejS
»

ASP: izbrati samo zadnji zapis

Oddelek: Izdelava spletišč
5944 (872) swalow
»

En enostaven querry v MySQL :(

Oddelek: Programiranje
141468 (1269) krneki0001

Več podobnih tem