21. oktober 2003 - 09:26Der er
21 kommentarer og 1 løsning
Samtidighed, flere brugere og post låsning
Når Access 2002 bruges som database med Jet til en Asp.Net/C# web(intranet) applikation hvor der er flere brugere, hvordan er så samtidigheden? Jeg kan forstå man kan sætte låse, men er det på poster i en tabel, eller er det kun poster i formularer og forespørgsler? Jeg læser kun fra forespøglser, men skriver direkte i tabellerne. Er der nogle der har nogle links til informationer om samtidighed i Access 2002, eller nogle der har afprøvet det?
Der er tale om max. 20 brugere, og det er sjældent at der sker noget på samme tid, samt databasen åbnes kun mens en sætning udføres og lukkes derefter igen, men jeg skal have 100% vished (ABSOLUT 100%) om at Access kan håndtere læse/skrive adgang på samme tid.
Jo hurtigere svar,jo hurtigere kan vi snakke om tildeling af flere points.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Access kan sagtens håndtere at flere brugere læser samtidig med at én bruger skriver. Problemet er der kun hvis 2 brugere forsøger at skrive i samme post på samme tid. Men dette vil formentlig kun ske meget sjældent, da du jo skriver at du lukker forbindelsen hurtigt igen efter en skrivning.
Access kan godt håndtere samtidigehed, sålænge to brugere (eller processer) ikke redigerer i den samme record samtidig. Husk at når der skrive til database, bør det gøres ved en UPDATE eller INSERT SQL sætning, eller ved et ADO recordset der et åbnet med OPTIMISTIC Locking.
Henrik-> jeg har spurgt dig før: læser du nogensinde spørgsmålene rigtigt inden du svarer? eller gælder det bare om at svarer hurtigst muligt, så man har en chance for at få point? (det gælder også dit svar i spørgsmålet for lidt siden om X1 og X2)
Hvad kan man så gøre for at forhindre fejl hvis 2 bruger forsøger at skrive i samme post på samme tid? Er der noget dokumentation for alt dette, samt sandynligheden for hvornår dette kunne ske? Gerne henvisninger til dokumentation
Jeg kan ikke henvise til noget dokumentation ud over at foreslå dig at slå op i den inbyggede online-hjælp i Access eller søge på msdn.microsoft.com
Ang. sansynlighed, så kan man ikke sige dette, da det helt afhænger af systemet, antallet af brugere, samt hvilken type data du arbejder med. Hvis du f.eks. har et system, hvor brugerne kun logger ind og ser/redigere deres egne personlige data, så vil du jo aldrig få noget problem, da den samme bruger kun logger ind én gang samtidig. Hvis du i stedet har f.eks. en kundedatabase, så kan flere brugere - i princippet - godt redigere den samme kunde samtidig. Men gør de det? Hvis man redigerer en kunde, så er det jo fordi at man f.eks. har modtaget et brev med de nye stamdata eller har kunden i telefonen. Men begge dele vil kun én bruger sætte sig ned og taste ind. Det er derfor kun Jer/dig som kan vurdere hvor tit 2 brugere vil risikere at rette i den samme post samtidig (og hvis du sørger for at opdatere med SQL - dvs med UPDATE, INSERT og DELETE - så er samtidig altså inden for samme splitsekund.
Derudover må du lægge noget fejlhåndtering ind, som tager hånd om koden, når der i sjældne tilfælde opstår konflikter. (jeg ved ikke så meget om ASP og C#, så den del af det vil jeg overlade til andre)
Henrik-> Janni snakker om en web-løsning og du snakker om en Access-løsning
Jeg bruger ADO.Net med OleDb commands, så hvordan kodemæssigt låser jeg så tabellerne, det skal siges at alle mine metoder til databasen ligger i forskellige klasser og arver fra en klasse som har connection stringen, samt de andre klasser kalder metoder fra denne klasse til at udføre selve kaldet, der er undtagelser i de tilfælde hvor jeg har transaktioner, men de er vel sikret i sig selv og låser tabeller pr. automatik, ikk? De får dog connectionstringen fra arveklassen... gør det det bedre eller værre for en løsning på komplet samtidighedskontrol, hvor næsten 100 % sørges for at databasen?
Concerning ADO.NET! Access doesnt use ADO.NET (yet) so now the question is drifting off into another area. I can suggest you look at this link, even better try getting hold of a ADO.NET book!
Hmm det kan jeg ikke bruge til noget. det jeg vil vide er i hvor høj grad kan jeg stole på at Access håndterer samtidighed og og hvordan dækker jeg mig ind for resten, jo mindre kodning jo bedre.
you can be sure that IF you LOCK your tables BEFORE you update then others can NOT update the record at the same time. In ALL multi user systems it WILL be necessary to take into account other users trying to do other operations on the same record. No matter what system you use Access, SQL Server or any other for that matter YOU need to make it as user friendly as possible by reacting on errors which you WILL get if others try altering a record which is locked.
janni>I hope you dont mis-understand me, but your question HAS been answerd and now it is up to you to find out how you open a recordset in ADO.NET with locking! If you know nothing about ADO.NET then your going to have to learn, and suggest you get hold of a book.
But you can be assured that IF you use locking with Access then things work as you expect.
Ok, Terry, now don't misunderstand me - therefore english! I asked for 100% certainty, and if don't think I got that. I got different things - but where's the truth? 1. Access does handle concurerncy, but not when 2 or more writes to same record( regardless of settings in Access?? and not on tables, but on quaries), but the chances of that happening is diffuse and therefore not an 100% answer. 2. I can put in some coding to handle the problem Access (2 user to one record) can't handle - BUT WHAT?? 3. You say ADO.Net, BUT then you say Access can't work with ADO.NEt, but still you want me to learn about ADO.NET 4. You say that if i lock the table before update then all will be good - Again what are you reffering to? 5 Then the last thing - whish is totally 180 the other way - IF i use locking with Access the things will work... Again where is the 100% certainty answear to DOES ACCESS HANDLE ALL CONCURRENCY and how or if code is involved and i can't use ADO.NET what kind of code is that... IF You can give me that precise answear, my friend the points will come down on you
btw if i had time to learn about it, i would, but i'm under timepressure and are wiiling to put more points to get me the 100 % answear asap... :o) "The idea of inventing the wheel again is suppressed by weight of the time"
Access is a database and also a development tool for making database applications. When I say Access doesnt work with ADO.NET I mean Access as a development tool NOT the actual database! When useing Access as a development tool then IT uses either DAO or ADO (NOT ADO.NET).
When YOU use access from your C# program using ADO.NET you are using the access database NOT the Development tool. I know almost nothing about C# and ADO.NET, but I am 99.99999.... % sure that YOU CAN open a recordset from ADO.NET in some sort of LOCK MODE which will handle your concurrency, and this applies to almost ALL databases. BUT in the case of other databases too, if you dont make some error checking then HOW are you going to tell other users that the record is locked by another user or what ever? Someone has to do this!
I cant teach you how to use ADO.NET and certainly not for 150 points of 200 (which is the max) that is why I say you need to learn ADO.NET yourself.
OK sidste spørgsmål inden jeg give svar - please besvar dette, så skal jeg nok give points. Hvis jeg sætter Access til at være recordlevet låst, gælder det så på tabeller og i så fald vil en række i en tabel være låst hvis jeg kalder en update, delete metode på rækken, eller vil man stadig kunne læse/skrive i den, hvis det nu sker på samme tid, men som jeg kan forstå der er megamillion chance for aldrig sker??
In ADO (2.6) there are four lock types. Read-only pessimistic optimistic batch optimistic
If we look at the second and third, pessimistic means that the record will be locked as soon as you start editing it an will remain locked until the update is cancelled or commited. Other users will NOT be able to alter the record at the same time. So if you go off to lunch the dont be surprised if people get annoyed when you come back. This is the BEST method of ensuring that only one person gets to update.
Optimistic locking occurs only when you try to commit the changes you have made. So if two people read the same record and then one of them tries to commit the changes then an error will occur. This is because ADO doesnt know which persons data is correct.
So as long as you use pessimistic locking then you will have no problems. How this is done in ADO.NET I dont know (yet).
NOTE: In Access (development tool) you can set the locking method, this doesnt apply to the Access database from your C# program but the forms etc. developed in the development tool. From you C# program you MUST lock the record using ADO.NET!
ok ja i ADO.Net kan dette kun lade sig gøre ved hjælp af dataset som jeg desværre ikke bruger. Jeg tror faktisk jeg bliver nødt til at drage den konklusion at jeg ikke kan håndtere 100 % samtidighed, men tak for hjælpen og points går til dig terry fordi du blev ved med at forsøge, tak for det...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.