Tema: Re: Need nuomonės iš šono - DB
Autorius: Laimis
Data: 2011-12-07 22:51:36
NicMC rašė:
> On 2011.12.07 17:41, Laimis wrote:
>> Pirma realiai išbandyk. Nes tolko aklai upgrade'inti hw, tai panašiai
>> tiek pat, kaip išgerti apelsinų sulčių, vietoje citrinų, tikintis, kad
>> tos bus švelnesnės (jos bus švelnesnės), kai šalia gal padėta stiklinė
>> stiklinė pieno...
>
> Tai pabandysi, tikraiu pabandysiu - kitą trečiadienį žinosiu.

Keletas minčių dėl konkurentiškumo. Galima būtų pabandyti realizuoti taip:
Pasirašyti trigerį, kuris kas tam tikrą laiką išrinktų iš tos sąlyginai 
didelės lentelės į atskirą lentelę (kuri, beje, gali būti in memory) 
eilinę ID porciją (kokį šimtuką-tūkstantuką, priklausomai nuo to, kaip 
sparčiai valgoma ta eilė).
Tada kiekvienas klientas nerakindamas lentelės skaito jau kur kas 
mažesnę lentelę:
1) SELECT id FROM que WHERE reserved = 0 ORDER BY id LIMIT 1

ir transakcijoje bando rezervuotis id:
2) UPDATE que SET s_id = CONNECTION_ID(), reserved = 1 WHERE id = {ID}

iš karto po to pasitikrina ar tokio id rezervacijos nenukniaukė kita 
transakcija (t.y. ar pavyko rezervacija):
3) SELECT id, s_id, reserved FROM que WHERE id = {ID}

ir jei nenukniaukė (s_id = CONNECTION_ID(), tai toliau jau vienoje 
transakcijoje:
{...}
DELETE FROM que ...
DELETE FROM original_que ...

Jei nepavyko, tai kartojamas ciklas nuo 1).

Tokio sprendimo *teorinis* privalumas, kad neblokuojamas skaitymas ir 
rašymas/trynimas ir tai vyksta iš esmės lygiagrečiai, o ne nuosekliai. 
Kolizijos (blokavimas) įvyksta tik tuomet, jei keletas (bent du) 
konkuruojantys ir sinchroniški SELECT'ai perskaitė tą patį nerezervuotą 
id ir bando jį rezervuotis.
Tai reiškia, kad SELECT'ai įvyksta beveik sinchroniškai, gal tik 
milisekundės (dalių) postūmiu (nes jei kiek labiau pasistūmę, tai 
anksčiausioji transakcija suspėtų rezervuoti).
Tačiau ir kolizijos atveju, viena laimėjusi (sėkmingai rezervavusi) 
transakcija tęsia darbą. Ribinė situacija, jei kaskart vis įvyktų 
kolizija, artėtų prie nuoseklaus apdorojimo spartos, tačiau 
paviršutiniškai žiūrint vis tiek būtų spartesnė.

Jei nesvarbus valgymo eiliškumas (t.y. iš esmės nėra FIFO, tik pagal 
sąlygą „reikalinga garantija, kad nei vienas valgantis klientas negaus 
įrašo, kurį ką tik gavo kitas klientas“), tai juk galima klientams 
paskirstyti id porcijomis (po kokį šimtuką-tūkstantuką), ir jie 
nesipešdami dėl rakinimo/skaitymo iš vienos lentelės kiekvieną sykį, 
lygiagrečiai apdorotų paskirto paketo eilutes...