Forum » Programiranje » 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.
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.
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.
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;
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;
SELECT TOP 10000 * FROM TTT WHERE Deleted = 0 ORDER BY ID;
I am what I am and I do what I can
borchi ::
ne, ne, ne...
uporabi hint UPDLOCK v kombinaciji z READPAST.
begin tran
select top 100 *
from BLABLA with (UPDLOCK, READPAST)
commit tran
uporabi hint UPDLOCK v kombinaciji z READPAST.
begin tran
select top 100 *
from BLABLA with (UPDLOCK, READPAST)
commit tran
l'jga
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Problem v AccessuOddelek: Programska oprema | 818 (732) | poweroff |
» | random funkcija accessOddelek: Programiranje | 1309 (1174) | ToniT |
» | ASP problemček (MDB)Oddelek: Izdelava spletišč | 940 (861) | AndrejS |
» | ASP: izbrati samo zadnji zapisOddelek: Izdelava spletišč | 944 (872) | swalow |
» | En enostaven querry v MySQL :(Oddelek: Programiranje | 1468 (1269) | krneki0001 |