Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Lock tabele iz stored procedure

[es] :: MySQL :: Lock tabele iz stored procedure

[ Pregleda: 2863 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.kwcp.net.

Sajt: www.mika.rs


+6 Profil

icon Lock tabele iz stored procedure24.09.2009. u 15:01 - pre 176 meseci
Pozdrav svima.

Tek sam od skoro poceo da se ozbiljnije bavim MySQL-om, pa sam naleteo na problem iz naslova. Koliko vidim po netu, to nije moguce. Da li neko ima ideju kako zaobici sledeci problem: stored procedura radi select (trazi MAX) pa update nad tom istom tabelom sa podatkom iz prethodnog selecta, vrlo je moguce da u medjuvremenu druga stored porcedura pokusa da uradi update i da izmeni vrednosti od kojih uzimam MAX izmedju selecta i update-a prve stored procedure, a to naravno ne sme da se desi. Ja racunam da mi treba write lock nad tabelom dok prva storka ne zavrsi svoj posao. Trazio sam po netu, ali nisam nista nasao.

Hvala.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure24.09.2009. u 15:38 - pre 176 meseci
lock iz stored procedure nije dozvoljen. ako napises upit koji oces da izvrsis mozda ti pomognemo da ga napravis tako da mu nije potreban lock
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.kwcp.net.

Sajt: www.mika.rs


+6 Profil

icon Re: Lock tabele iz stored procedure24.09.2009. u 16:40 - pre 176 meseci
Citat:
bogdan.kecman: lock iz stored procedure nije dozvoljen. ako napises upit koji oces da izvrsis mozda ti pomognemo da ga napravis tako da mu nije potreban lock


Primetio sam da nije dozvoljeno Evo upita, ali sumnjam da je moguce bez lock-a.

Code:

create procedure sp_MoveToStack1(strand int)
begin
    select @ordinal := Max(Location.Ordinal) + 1, @locationInfoID = Location.LocationInfoID from Location
        inner join LocationInfo on Location.LocationInfoID = LocationInfo.LocationInfoID
    where LocationInfo.Name = 'StackTable1'
    group by Location.LocationInfoID;

    update Location
        inner join LocationInfo on Location.LocationInfoID = LocationInfo.LocationInfoID
    set Location.LocationInfoID = @locationInfoID, Location.Ordinal = @ordinal
    where Location.Ordinal = strand
        and LocationInfo.Name = 'CuttingTable';
end


Druga:
Code:

create procedure sp_MoveToMonorail()
begin    
    update Location
        inner join LocationInfo on Location.LocationInfoID = LocationInfo.LocationInfoID
    set Ordinal = Ordinal - 1
    where LocationInfo.Name = 'StackTable1';

-- ostatak je nebitan
end


Evo i kratko objasnjenje sta se desava. Tabela Location drzi gde se neki materijal trenutno nalazi. Opis tog mesta se nalazi u tabeli LocationInfo. Zavisno od mesta gde se nalazi, podaci u tabeli Location se drugacije ponasaju. Npr. ako su na 'StackTable1' onda treba da se ponasa kao FIFO, kada su u 'CuttingTable' onda je nasumicni pristup. Prva storka prebacuje nasumicni podatak jedinstveno oznacen preko polja 'Strand' sa lokacije 'CuttingTable' u 'StackTable1' na poslednju poziciju (polje Ordinal). Dok se to desava, vrlo je moguce da ce nesto if FIFO bafera izaci pre nego se uradi update, i onda je MAX vrednost pogresna.

Ja ne vidim drugog nacina nego da se spreci update iz druge stored proc. dok prva ne zavrsi sta je pocela.

Hvala na pomoci !
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure24.09.2009. u 23:06 - pre 176 meseci
koji je storage engine u pitanju? ako je myisam - jedino sto mozes da uradis je application lock ... tj da ti u proceduri simuliras neki mutex, dakle da (re)setujes neku globalnu varijablu i da proveravas da li je setovana pa cekas dok se ne resetuje da nastavis (pa je ti setujes i resetujes kad zavrsis) ...

ako je innodb, onda teoretski mozes da resis problem sa razlicitim transaction isolation levelom ...
http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html

procitaj pazljivo pa vidi sta ti najbolje radi posao
READ COMMITTED / REPEATABLE READ / SERIALIZABLE

SERIALIZABLE ti je najsigurniji samo obrati paznju da autocommit mora da je ugasen, dakle moras sam da zapocnes i zavrsis transakciju.

sa autocommit upaljenim, jedini nacin ti je isto kao i sa mysam .. neki app level locking
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.kwcp.net.

Sajt: www.mika.rs


+6 Profil

icon Re: Lock tabele iz stored procedure25.09.2009. u 14:21 - pre 176 meseci
Hvala ! Da, koristim InnoDB i malopre resio sam tako sto sam otvorio transakciju i koristio IX lock nad selektovanim redovima - sto mi je zapravo trebalo, a ne lock nad celom tabelom.

Hvala jos jednom
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.dialup.neobee.net.

Sajt: odbrojavanje.com


Profil

icon Re: Lock tabele iz stored procedure25.09.2009. u 20:23 - pre 176 meseci
Posto imam isti problem, bio bih ti zahvalan 'dusty', kada bi ukratko opisao
kako si transakcijom i zakljucao samo selektovane redove a ne celu tabelu.

Kako se koristi "IX lock" i sta je to?
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure25.09.2009. u 20:51 - pre 176 meseci
http://dev.mysql.com/doc/refman/5.1/en/innodb-lock-modes.html

da bi dobio IX lock radis "select ... for update"


 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.DIALUP-SMIN.neobee.net.

Sajt: odbrojavanje.com


Profil

icon Re: Lock tabele iz stored procedure28.09.2009. u 08:28 - pre 176 meseci
Imam proceduru koja izvrsava inserte u razlicite tabele.
Transakcija mi je potrebna jer ako neki insert padne sve treba da se vrati na predjasnje stanje.

Da li je resenje da pre poziva procedure izvrsim transaction start,
a posle poziva procedure kada ona vrati neku vednost da na osnovu nje izvrsim commit ili rollback?
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure28.09.2009. u 09:41 - pre 176 meseci
generalno sa begin/commit treba da uokviris deo koji hoces da bude izvrsen "ceo" dakle ako jedna stvar u njemu pukne da se sve vrne kako je bilo ... u tvom slucaju, verovatno je odgovor da ..
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.DIALUP-SMIN.neobee.net.

Sajt: odbrojavanje.com


Profil

icon Re: Lock tabele iz stored procedure28.09.2009. u 10:05 - pre 176 meseci
Ucinilo mi se da ne mogu u proceduri da zapocnem transakciju pa moram izvanje nje pre nego je pozovem. Isto tako i comit i rollback, ali vidim da sam poglesio.
Znaci transakcije su moguce u samoj proceduri bez problema.

Imam drugu dilemu: Kada se LOCK ROW koji je aktiviran sa SELECT FOR UPDATE otpusta?

Da li se otpusti automatski kada se procedura zavrsi, ili
kada se zavrsi transakcija u proceduri (ako je taj SELECT FOR UPDATE obuhvacen transakcijom)?
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure28.09.2009. u 10:28 - pre 176 meseci
Citat:
zgas: Ucinilo mi se da ne mogu u proceduri da zapocnem transakciju pa moram izvanje nje pre nego je pozovem. Isto tako i comit i rollback, ali vidim da sam poglesio.
Znaci transakcije su moguce u samoj proceduri bez problema.


za ovakve stvari - uvek je najbolje da testiras :)
ako se ja dobro secam, mozes da zapocnes novu transakciju u pola stored procedure i onda da je zavrsis van iste .. dakle izlazak iz stored procedure ne komituje implicitno transakciju koja je zapoceta unutar stored procedure ..

kao sto rekoh - probaj ovo pre nego mi poverujes na rec, ja licno to nikad nisam radio, uvek mi je sp deo transakcije, nikad nisam zapocinjao transakciju unutar sp.

Citat:

Imam drugu dilemu: Kada se LOCK ROW koji je aktiviran sa SELECT FOR UPDATE otpusta?

Da li se otpusti automatski kada se procedura zavrsi, ili
kada se zavrsi transakcija u proceduri (ako je taj SELECT FOR UPDATE obuhvacen transakcijom)?


select for update uvek mora da bude u transakciji .. obrati paznju da si "uvek u transakciji" .. pitanje je samo da li imas autocommit pa imas commit odma posle svake komande (te select for update nema nikakvog smisla) ili commit imas explicitno...
lock se skida po zavrsenoj transakciji ...

procitaj:
http://dev.mysql.com/doc/refman/5.1/en/innodb-locks-set.html

za detalje .. posto ce nekad select for update zalokovati neku sicu preko toga sto si hteo .. i nece odmah pustiti to sto nije neophodno .. takodje ima jos nekih sitnih tripova ali nije preterano bitno ... sve pise na linkovanoj strani
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.DIALUP-SMIN.neobee.net.

Sajt: odbrojavanje.com


Profil

icon Re: Lock tabele iz stored procedure28.09.2009. u 11:44 - pre 176 meseci
Kecmane hvala ti na pomoci, skoro uvek si detaljan i spreman za pomoc.

Malo mi je nezgodno mi je da transakciju pocinjem izvan procedure jer PHP-om pozivam proceduru, pa ne bu zeleo da PHP-om saljem vise upita da bi izvrsio zadatak vec samo jedan - a to je poziv procedure.

Inace pretpostavljam da nisu dozbvoljene ugnezdjene transakcije: ako se u transakciji poziva neka procedura koja vec sama u sebi ima transakciju?
Pa je stoga bolje izbeci transakcije unutar procedura?

Znaci samo da zakljucimo u vezi sa ROW LOCK:
Imam proceduru u kojoj zapocinje transakcija i zavrsava se u njoj.
Znaci: Moram obratiti paznju da mi SELECT FOR UPDATE bude unutar transakcije da bi LOCK bio otpusten prilikom zavrsetka transakcije?


E sad imam pitanje u vezi sa SELECTED FOR UPDATE:
Sta ako SELEKTUJEM vise tabela:

Code:
SELECT id1 FROM t1 
LEFT OUTER JOIN t2 ON t1.id1 = t2.id2
WHERE t1.id1 = 1
FOR UPDATE;


Da li ce biti zakljucane obe tabele, i koji redovi?
Ako imam vise selektovanih redova iz t2 (koja je child t1) da li ce svi oni biti LOCK-ovani dok se transakcija ne zavrsi?

[Ovu poruku je menjao zgas dana 28.09.2009. u 13:51 GMT+1]
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure28.09.2009. u 15:18 - pre 176 meseci
Citat:
zgas: Kecmane hvala ti na pomoci, skoro uvek si detaljan i spreman za pomoc.


opusteno :) dokle god pitanja imaju smisla i nemaju odgovor kao prvi link na googletu spreman sam da pomognem ..


Citat:

Malo mi je nezgodno mi je da transakciju pocinjem izvan procedure jer PHP-om pozivam proceduru, pa ne bu zeleo da PHP-om saljem vise upita da bi izvrsio zadatak vec samo jedan - a to je poziv procedure.


jasno .. ako je to jedino sto treba da se odradi ima smisla

Citat:

Inace pretpostavljam da nisu dozbvoljene ugnezdjene transakcije: ako se u transakciji poziva neka procedura koja vec sama u sebi ima transakciju?
Pa je stoga bolje izbeci transakcije unutar procedura?

yup - nisu podrzane

Citat:

Znaci samo da zakljucimo u vezi sa ROW LOCK:
Imam proceduru u kojoj zapocinje transakcija i zavrsava se u njoj.
Znaci: Moram obratiti paznju da mi SELECT FOR UPDATE bude unutar transakcije da bi LOCK bio otpusten prilikom zavrsetka transakcije?


razmisli malo :) ... select for update drzi lock dok traje transakcija ... ako imas autcommit transakcija traje koliko traje taj select, dakle moras da imas transakciju da bi to imalo smisla ..

Citat:

E sad imam pitanje u vezi sa SELECTED FOR UPDATE:
Sta ako SELEKTUJEM vise tabela:

Code:
SELECT id1 FROM t1 
LEFT OUTER JOIN t2 ON t1.id1 = t2.id2
WHERE t1.id1 = 1
FOR UPDATE;


Da li ce biti zakljucane obe tabele, i koji redovi?
Ako imam vise selektovanih redova iz t2 (koja je child t1) da li ce svi oni biti LOCK-ovani dok se transakcija ne zavrsi?


ovako .. najbolje sto mozes da uradis, da bi to najbolje razumeo je - probas :D
okacis se na mysql sa dve konekcije i u jednoj konekciji uradis select for update a iz druge pogledas sta je zakljucano .. dodatno imas innodb monitor koji ce ti dati dodatne informacije ..

e sad, sto se tice samog pitanja, da bice zakljucani slogovi u obe tabele. bice zakljucani svi slogovi koji odgovaraju select-u dadakle u t1 svi koji imaju id-1 i u t2 koji imaju id2=1

obrati paznju da ce innodb vrlo cesto zakljucati ceo page umesto samo row tako da ce u stvari biti zakljucano malo vise redova nego sto podrazumeva ovaj upit ali na to ne mozes da utices
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.dialup.neobee.net.

Sajt: odbrojavanje.com


Profil

icon Re: Lock tabele iz stored procedure29.09.2009. u 09:18 - pre 176 meseci
Da li se zakljucavaju innodb child tabele?

Znaci ako sam uradio SELECT FOR UPDATE na nekom redu u innodb prvoj tabeli
da li ce ona zakljucati u CHILD tabeli redove koji sadrze u svojoj FK koloni vrednosti zakljucanih redova iz prve tabele?

Kako sam testirao nece, ali me interesuje da li ima nekad izuzetaka i u kom slucaju?
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Lock tabele iz stored procedure29.09.2009. u 12:11 - pre 176 meseci
Citat:
zgas: Da li se zakljucavaju innodb child tabele?


ne



 
Odgovor na temu

[es] :: MySQL :: Lock tabele iz stored procedure

[ Pregleda: 2863 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.