MsSQL zaklepanje

1. Obstaja kakšen mehanizem v MsSQL-u, ki ko nek uporabnik dostopa (editira) do določenega zapisa ostalim uporabnikom ne dovoli editiranja tega zapisa? Kakšen je običajen pristop v takih primerih?

2. Kako deuje nastavitev na MsSQL, ki ob spremebi ID-ja po odvisnih tabelah spremeni foreign key-e v primeru, da v tistem trenutku nek uporabnik edetira zapis v odvisni tabeli?

 

Lep dan še naprej

Matjaž 

Avtor: o-MA-n-tjaz, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

petar.repac
petar.repac - sreda, 21. marec 2007

1. Poznamo dva mehanizma: pesimistična in optimistična hkratnost (pessimistic/optimistic concurrency) . Pri prvi zaklenemo zapis pred editiranjem, tako smo prepričani da ga noben ne more spremeniti v času ko zapis spreminjamo. Kot je povedal Miha ta način deluje samo pri connected načinu (klient je ves čas povezan z bazo, zato lahko drži lock na zapisu). Ker pri .NET aplikacijah najpogosteje delamo disconnected način nam ta način odpade. Pri optimistični hkratnosti smo optimistični in pričakujemo da je verjetnost da nekdo popravlja isti zapis kot mi zelo mejhna. Zato nič ne zaklepamo pri editiranju, temveč pri UPDATE-u preverimo ali se je zapis mogoče medtem spremenil. To najlažje naredimo tako da v tabelo dodamo kolono TimeStamp v kateri hranimo čas zadnje spremembe (vrednost recimo nastavimo v AFTER UPDATE triggerju). TimeStamp pri editiranju zapomnimo in pri UPDATE-u preverimo če se je mogoče spremenil. Če je bila spremenjen sporočimo uporabniku da ga je nekdo prehitel.2. Verjetno misliš na nek način cascade update-ov. Ne vem če to SQL Server omogoča, ampak če ti načrtuješ podatkovni model ti priporočam da uporabljaš negovoreče primarne ključe (npr. uporabiš IDENTITY). Vsi foreign ključi bi zato morali vsebovati negovoreče ključe. V tem primeru ne vidim nobenega razloga za spreminjanje ID-ja. Torej problem odpade. LP, Petar

MihaM
MihaM - torek, 20. marec 2007

1. Če govorimo o .net aplikacijah, kjer je disconnected način prevladujoč, boš moral to nekako programsko rešit (bodisi na strani odjemalca in/ali strežnika) - s kakšnimi zastavicami v vrsticah ali kaj takega. Moraš pa paziti, da ti zapis ne ostane "zaklenjen" za vedno (če se odjemalec usuje npr.)2. Mislim, da mi ni prav jasno kaj hočeš.