Hkratni vnosi v podatkovno bazo (PHP MySQL)
 
thomass 20. apr 2016 06:16:25 Pridružen od:
30. avg 2011
20 objav
21 0 0
#1

Pozdravljeni!



Po spletu nisem našel točnega odgovora, ali pa nisem znal zastaviti vprašanja. Zanima me, kaj se zgodi, če na spletni strani, ki beleži prijave v podatkovno bazo (1 tabela), dva obiskovalca izpolnita obrazec v istem trenutku. Povezava se vzpostavi z mysqli_connect, vnos pa se izvede s pomočjo mysqli_query - za tem se povezava zapre.



Če se v takem primeru zabeleži samo ena prijava, me zanima, kako bi se to preprečilo. Nekaj sem prebiral o MySQL transactions, ampak na tem področju še nisem delal - je to pravi način?


všeč(0) ni všeč(0) spam(0)
 
carli 20. apr 2016 06:19:40 Pridružen od:
5. avg 2008
1258 objav
583 54 17
všeč(0) ni všeč(0) spam(0)
 
Javornik 20. apr 2016 06:21:59 Pridružen od:
15. jun 2010
431 objav
375 27 4
#3

Po domače bi ti razložil tako, da se queryiji postavijo v vrsto in se izvajajo eden za drugem. Sigurno pa se dva querya ne moreta izvesti ob popolnoma enakem času oziroma hkrati. Mysql server zna to pohendlat.


všeč(0) ni všeč(0) spam(0)
 
thomass 20. apr 2016 06:43:04 Pridružen od:
30. avg 2011
20 objav
21 0 0
#4

Javornik:

Po domače bi ti razložil tako, da se queryiji postavijo v vrsto in se izvajajo eden za drugem. Sigurno pa se dva querya ne moreta izvesti ob popolnoma enakem času oziroma hkrati. Mysql server zna to pohendlat.




Če prav razumem - do opisanega scenarija (manjkajoče prijave, zgolj zaradi opisane povezave spletne strani z bazo) ne more priti?



Hvala za odgovor.


všeč(0) ni všeč(0) spam(0)
 
pavarti 20. apr 2016 08:51:11 Pridružen od:
26. okt 2011
445 objav
587 92 14
#5

Če dva uproabnika pošljeta poizvedbo se bosta izvedle obe. Transakcije ni potrebno uporabljati. Le ta se uporablja za bolj zahtevne zadeve npr. brišeš več različnih zapisov, ki so med sabo povezani. V primeru da vmes pride do napake, transakcijo prekineš in podatki se "resetirajo" na stanje pred začetkom transakcije.


všeč(0) ni všeč(0) spam(0)
 
Spartacus 20. apr 2016 10:27:44 Pridružen od:
23. dec 2007
642 objav
828 38 4
#6

Sej verjetno je "no brainer", ampak: Vse zgoraj napisano velja ob predpostavki, da se vrednost primarnega ključa (npr. id zapisa) generira na strani baze (npr. autoincrement).



Naleti se pa tudi na implementacije, kjer se iz baze prebere zadnji ID, se ga "ročno" poveča za 1 in se ga uporabi v sql insertu. V takšnem primeru so pa lahko težave (poleg tega, da se tega sploh ne bi smelo delat :) ).


všeč(0) ni všeč(0) spam(0)
 
svizec 20. apr 2016 10:34:22 Pridružen od:
7. mar 2007
280 objav
164 23 10
#7

Spartacus:

Sej verjetno je "no brainer", ampak: Vse zgoraj napisano velja ob predpostavki, da se vrednost primarnega ključa (npr. id zapisa) generira na strani baze (npr. autoincrement).



Naleti se pa tudi na implementacije, kjer se iz baze prebere zadnji ID, se ga "ročno" poveča za 1 in se ga uporabi v sql insertu. V takšnem primeru so pa lahko težave (poleg tega, da se tega sploh ne bi smelo delat :) ).




Ok, to se sploh ne sme delat, ampak v primeru da je, pa potem verjetno tudi polje ID ni unique in bi spet obe poizvedbi zapisalo in bi obe obstajale... In če bi klical po ID-ju bi potem dobil pač 2 zapisa...


všeč(0) ni všeč(0) spam(0)
 
Spartacus 20. apr 2016 10:43:26 Pridružen od:
23. dec 2007
642 objav
828 38 4
#8

Ne, se ne sme tega delat :)



Ampak tole je precej pogost kiks, ki se pojavlja predvsem v kakšnih "študijskih" primerih, ko se človek še malenkost uči kako in kaj. In če z mojim offtopicom vsaj enega (bodočega) developerja odvrnem od početja tega, then my work here is done :)


všeč(0) ni všeč(0) spam(0)
 
thomass 21. apr 2016 06:10:20 Pridružen od:
30. avg 2011
20 objav
21 0 0
#9

:)



ID ima nastavljen auto_increment.



Hvala za odgovore.


všeč(0) ni všeč(0) spam(0)
 
 

🔒 Za odgovor na to temo se moraš prijaviti.

Prijavi se