Forum » Programiranje » Entity framework skoraj sočasen insert
Entity framework skoraj sočasen insert
detroit ::
V imam ef (db first) in recimo objekt oseba. Oseba ima ime, ki mora biti unique (nima indexa na db). In preden ustvarim novega preverim če nekdo s tem imenom že obstaja in če obstaja ga ne ustvarim.
Problem se pojavi če istočasno shraniš. potem se pojavita dve osebi z istim imenom. Očitno še ne obstaja v tistem trenutku. Ali je kaka rešitev za to ali je potreben unique index nastavit?
Problem se pojavi če istočasno shraniš. potem se pojavita dve osebi z istim imenom. Očitno še ne obstaja v tistem trenutku. Ali je kaka rešitev za to ali je potreben unique index nastavit?
Skero
sebastjan28 ::
Če polje ni ekstremno veliko(ime verjetno ni), bi jaz v vsakem primeru postavil unique constraint pač - last line of defense.
Če to mogoče, bi jaz kot drugo rešitev naredil store proceduro, ki najprej preveri, če že obstaja in nato izvede insert.
Če to mogoče, bi jaz kot drugo rešitev naredil store proceduro, ki najprej preveri, če že obstaja in nato izvede insert.
detroit ::
ja sj tale EF mi mal živce para... za selecte je zakon za karkoli drugega pa ...bruh. Mislim da v naslednjem projectu bom gotovo inserte in update delal s stored procedurami.
Skero
frudi ::
Če hočeš zagotoviti edinstvene vrednosti, potem moraš postaviti unique index v vsakem primeru, ker ne moreš biti siguren, da kdo nekoč ne bo šaril po bazi kako drugače, kot preko tvoje aplikacije. Torej, postavi unique index, namenjen je točno temu. Brezveze je pljuvati po orodju, če ne želiš uporabljati funkcij, ki so namenjene točno temu, kar želiš doseči.
Alternativno, zavij preverjanje in zapisovanje v transakcijo, ki zaklene tabelo za čas celotne transakcije. Ne počni tega, če transakcija traja predolgo in bi med tem rad dostopal do iste tabele od drugod.
Še alternativno, naj gredo vse operacije zapisovanja oseb preko singletona, na katerem uporabiš mutex, da zagotoviš, da samo ena nit naenkrat lahko izvaja operacije nad tabelo oseb. Tole je precej nuklearna opcija, ne počni tega brez zelo dobrega razloga in brez zavedanja posledic.
Alternativno, zavij preverjanje in zapisovanje v transakcijo, ki zaklene tabelo za čas celotne transakcije. Ne počni tega, če transakcija traja predolgo in bi med tem rad dostopal do iste tabele od drugod.
Še alternativno, naj gredo vse operacije zapisovanja oseb preko singletona, na katerem uporabiš mutex, da zagotoviš, da samo ena nit naenkrat lahko izvaja operacije nad tabelo oseb. Tole je precej nuklearna opcija, ne počni tega brez zelo dobrega razloga in brez zavedanja posledic.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
detroit ::
Mislim da je unique index edina logična rešitev. Sicer pa ne pljuvam po orodju, samo čudim se čemu ne zazna da že obstaja en tak s takim imenom (dam query na osebe.where(x=>x.ime == noventity.ime ... in ne obstaja). Oh well čudna so pota gospodova. Moram še mal naštudirat. Hvala za odgovore.
Skero
detroit ::
Evo našel kako do tega pride, odpreš stran in počakaš par minut in očitno se connection skensla vmes. Potem se lotiš insertov na dveh mašinah hkrati in voila težava.
Skero
frudi ::
Kakšen connection se prekine vmes? Na bazo? A povezavo na bazo odpreš že takoj, ko odpreš stran? Imaš kak poseben razlog za to? A si tudi preverjanje, ali zapis že obstaja, naredil že ko se stran odpre?
Povezavo odpri šele, ko sprožiš shranjevanje, šele v tem trenutku tudi preveri, če zapis že obstaja in če ne, sproži insert. To bi se moralo zgoditi dovolj hitro, da v praksi do podvojenih vnosov skorajda ne bi smelo priti. Če pa se že zgodi, pa imaš še vedno unique index.
Povezavo odpri šele, ko sprožiš shranjevanje, šele v tem trenutku tudi preveri, če zapis že obstaja in če ne, sproži insert. To bi se moralo zgoditi dovolj hitro, da v praksi do podvojenih vnosov skorajda ne bi smelo priti. Če pa se že zgodi, pa imaš še vedno unique index.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
detroit ::
Ko se odpre stran se izriše seznam oseb - od tod se odpre povezava. Koliko časa ja kontext drži nimam blage.
Ko shranjujem pa preverjam če že obstaja nekdo z istim imenom in ja vseeno pride včasih zato pa sem tudi dodal unique index (čez dva stolpca...imamo še nekaj drugih podatkov. V bistvu je oseba samo example name gre se za račune hehe).
Hvala Frudi
Ko shranjujem pa preverjam če že obstaja nekdo z istim imenom in ja vseeno pride včasih zato pa sem tudi dodal unique index (čez dva stolpca...imamo še nekaj drugih podatkov. V bistvu je oseba samo example name gre se za račune hehe).
Hvala Frudi
Skero
smacker ::
Klasični problem pri deljenju virov. Rešiš ga z atomarnimi procesi - IF obstaja THEN insert se mora izvesti brez prekinitve. Če se med tem kaj druga dogaja, potem informacija "IF obstaja" ni ažurna. Ta vmesni čas je pri tebi precej dolg - naložiš vse, potem traja par minut preden pride do inserta (vmes je lahko 100 novih insertov prišlo od drugod), potem pa primerjaš z neažurnimi naloženimi podatki. Atomarnost lahko zagotavljaš na različnih koncih - na nivoju baze s transakcijami, na nivoju aplikacije pa z zaklepanjem (mutex,...). Oboje ma pluse in minuse, ki jih je pametno naštudirat preden izbereš.
Unique atribut je pa varovalka za površnega programerja, ki jo je v vsakem primeru pametno nastavit. Če si samo nastavil na unique in ne zagotavljaš atomarnosti, pol si rešil samo to, da boš namesto podvojenega zapisa v bazi dobil exception - glej da ga boš vsaj pravilno shandlal. Pa najmanj kar lahko popraviš je, da pred klicem insert naložiš frišne podatke iz baze.
PS: sumim tut slabo zasnovo pdoatkovnega modela - računom daješ imena namesto incremental ID
Unique atribut je pa varovalka za površnega programerja, ki jo je v vsakem primeru pametno nastavit. Če si samo nastavil na unique in ne zagotavljaš atomarnosti, pol si rešil samo to, da boš namesto podvojenega zapisa v bazi dobil exception - glej da ga boš vsaj pravilno shandlal. Pa najmanj kar lahko popraviš je, da pred klicem insert naložiš frišne podatke iz baze.
PS: sumim tut slabo zasnovo pdoatkovnega modela - računom daješ imena namesto incremental ID
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [SQL] primary key inkrementalno dodajanje (strani: 1 2 )Oddelek: Programiranje | 5368 (4558) | ejresnevem |
» | SQL pomočOddelek: Programiranje | 2385 (1799) | miko22 |
» | MySql Vprasanje - problem dupliciranih kljucevOddelek: Izdelava spletišč | 1432 (1254) | KernelPanic |
» | [T-SQL] Kako vnest podatek v bazo in da ti hkrati vrne id?Oddelek: Programiranje | 2890 (2608) | dmok |
» | napaka na forumuOddelek: Slo-Tech | 1499 (1197) | Vuco |