» »

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?
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.

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.
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.
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
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 :O

detroit ::

imajo id dont worry, gre se za neko grupiranje in zaporedne številke:)
Skero


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[SQL] primary key inkrementalno dodajanje (strani: 1 2 )

Oddelek: Programiranje
515368 (4558) ejresnevem
»

SQL pomoč

Oddelek: Programiranje
132385 (1799) miko22
»

MySql Vprasanje - problem dupliciranih kljucev

Oddelek: Izdelava spletišč
131432 (1254) KernelPanic
»

[T-SQL] Kako vnest podatek v bazo in da ti hkrati vrne id?

Oddelek: Programiranje
162890 (2608) dmok
»

napaka na forumu

Oddelek: Slo-Tech
181499 (1197) Vuco

Več podobnih tem