Hkratni vnosi v podatkovno bazo (PHP MySQL)
6 naročnikov
6 naročnikov
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?
8 odgovorov
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.
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.
Č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.
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 :) ).
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...