| MySQL InnoDB transakcije | ||
|---|---|---|
|
ledi
20. sep 2010 10:16:12
Pridružen od: 14. avg 2008 681 objav 325 223 14 |
#1
A kdo ve če je tole slučajno možno: SELECT * FROM tabela WHERE nekopolje=4 ORDER BY sortpolje LIMIT 1 FOR UPDATE; če se sedaj večkrat kliče ta stavek v različnih transakcijah se da zadeva na neko wait listi in ko se 1. transakcija zaključi s commit dobi naslednja rezultat. In sedaj 1mil$ question :) lp |
|
|
ledi
20. sep 2010 10:29:32
Pridružen od: 14. avg 2008 681 objav 325 223 14 |
#2
našel sem da oracle omogoča FOR UPDATE NOWAIT in FOR UPDATE SKIP LOCKED Še vedno me pa za MySQL zanima če se je kdo srečal s podobnim problemom. |
|
|
fatg
21. sep 2010 22:08:08
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#3
Ne poznam, me pa zanima, v kakšnih primerih to potrebuješ? Ta lock ti prepreči dostop do zapisa, ker ga nameravaš spremeniti, torej nočeš, da ga kdo bere, dokler je v tem procesu. Če ti je vseeno, ali dobiš staro ali svežo vrednost, potem ne uporabi FOR UPDATE, temveč navaden select. Vzporedne transakcije bodo lahko do zapisa dostopale, dokler prva ne izvede updejta, torej ne samo do selecta. |
|
|
ledi
22. sep 2010 05:26:28
Pridružen od: 14. avg 2008 681 objav 325 223 14 |
#4
rabim zato ker imam narejeno čakalno vrsto. Ki se bo polnila preko spletnega portala. Čeprav bi šlo tudi tako, da se pač čakajo med sabo, ker bi bil delay minimalen, a samo dokler št. daemonov nebi bilo preveliko. In če že delam sistem potem že v štartu raje naredim tako kot se gre :) Če spustim FOR UPDATE je isto kot če ga dodam. Proces čaka da tisti ki je zaklenil podatek sprosti. |
|
|
fatg
22. sep 2010 07:27:11
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#5
Aha, razumem. Jaz se ne bi zanašal na locking baze za logiko deljenja podatkov, ne zato, ker ne bi delovalo, ampak ker se mi zdi, da spada to drugam. Recimo, da ena skripta izvaja selecte in jih pošlje workerjem, ki jih obdelujejo, rezultat pa zapišejo v bazo, hkrati pa izvedejo update na tem recordu (označijo recimo status=complete). Master skripta pa ves čas selecta neobdelane. Bi se dalo to še na par načinov, ampak jaz bi se res izognil bazi. |
|
|
ledi
23. sep 2010 05:23:12
Pridružen od: 14. avg 2008 681 objav 325 223 14 |
#6
Ena ideja, ki jo bom implementiral bo ta da bodo taski dodeljeni skupini workerjev. Znotraj te skupine bojo pa po principu roundrobin dobili taske- Že to ji bo palo razparceliralo. Če ne bo šlo drugače bom pa z oracle express integriral. Sam moram preverit če deluje python <-> oracle. Ker so workerji v pythonu pisani. |
|
|
ledi
23. sep 2010 05:42:24
Pridružen od: 14. avg 2008 681 objav 325 223 14 |
#7
Ja pa še to idejo sem imel select * from tabela where pogoj order by kolona, rand() limit 1 čeprav je rand() počasen pri velikem št. vrstic. tukaj bi bila verjetnost majhna, da dobita 2 procesa isto, bi bilo praktično identično SKIP LOCKED. Ker mi vrstni red obdelave niti ni tako pomemben. |
|
|
fatg
23. sep 2010 07:33:53
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#8
ja, pri veliko podatkih je rand() počasen, ker mora izbrati prav vse zapise in jih potem še razvrstiti. Poleg tega imaš še vedno neko realno možnost, da dva dobita isti zapis. |
|