cwbe coordinatez:
101
792011
2663954
2663960
2667830

ABSOLUT
KYBERIA
permissions
you: r,
system: public
net: yes

neurons

stats|by_visit|by_K
source
tiamat
K|my_K|given_K
last
commanders
polls

total descendants::
total children::1
show[ 2 | 3] flat


v praci som narazil na jeden (celkom zaujimavy) problem nad ms sqlserver, s ktorym zase nemam az take prenikave skusenosti, tak mi chvilku trvalo, kym som ho vyriesil. mozno bude niekoho zaujimat a niekomu sa bude hodit (myslim, ze je to jedna z beznejsich chyb). popisem priklad z praxe, kazdy, kto vie o com hovorim, by si tam mal najst potrebnu informaciu:

podmienky:

- majme tabulku J a tabulku V, ktore obsahuju informacie o ulohe. v J su standartne informacie o ulohe a vo V su premenne nabindovane k J cez J.id.
- majme dva druhy procesov:
1) update process - UPDATE queries v transakcii:

BEGIN TRAN
UPDATE J ...
UPDATE V ...
UPDATE V ...
...
UPDATE V ...
COMMIT

2) select process - SELECT query nad J

SELECT COUNT(*) from J ...

- majme takychto procesov pustenych niekolko (produkcna prevadzka bola cca 2 UPDATE + 2 SELECT viacmenej simultanne, ja som to testoval v 4/2 pri intervaloch spustania rand(0, 1000) milisekund)

nastava problem: DEADLOCKu nad SELECT query (process typu #2)

riesenie: skusal som vsetko, do primitivnych zaobalovaciek selectu do transakcie, cez read uncommited transakcie cez isolation level nad query, pomohlo - zda sa - nieco velmi trivialne, zakazanie uzamykania selectu pri count(*), co nam je vlastne aj tak jedno, kedze pri tom mnozstve poziadaviek tie cisla nemusia byt 100% presne a to, ze sa objavi odchylka je aj tak malo pravdepodobne. Takze spravna syntax SELECT query v procese typu #2 je:

SELECT count(*) from J (NOLOCK) where ...


test: 30000 update query v kazdom zo 4 procesov + 1200 select query v kazdom z 2 procesov bez deadlocku (inokedy mi to uz najneskor pri selecte#200 hodilo deadlock... takze dufam, ze je to ok



EDIT

nakoniec som - podla mojho nazoru - vybral este lepsie riesenie z ponukanych.
kedze NOLOCK funguje ako read uncommitted (tzn, berie do uvahy vsetko, aj neCOMMITnute riadky), existuje este jedna lepsia alternativa a to READPAST, ktora neberie do uvahy nic, co je locknute (tzn, riadky, ktore su prave spracovavane ignoruje). v tomto pripade mi to pride rozumnejsie, kazdopadne COUNT(*) je ako taky dost nespolahlivy a nikdy by sa nemal pouzivat ako dolezity udaj.

moja finalna query:

SELECT count(*) from J (READPAST) where ...





000001010079201102663954026639600266783005526565
qiNa
 qiNa      02.09.2010 - 09:07:34 , level: 1, UP   NEW
akurat to riesim v praci. Dva dni sa nemozem pohnut. Idem to skusit ...

00000101007920110266395402663960026678300552656505526570
reason
 reason      02.09.2010 - 09:12:45 , level: 2, UP   NEW
otovor okno , vezmi server vyhod ho von oknom :))))

0000010100792011026639540266396002667830055265650552657005526713
qiNa
 qiNa      02.09.2010 - 10:13:34 , level: 3, UP   NEW
ved chudak, v jednom okne uz je... :D