Avatar billede puppetmaster Nybegynder
12. december 2003 - 10:26 Der er 33 kommentarer og
1 løsning

Skrivekonflikt i SQL Server

Under en brugers opdatering af en given post, har jeg oplevet en konflikt som jeg ikke har set før i forbindelse med SQL Serveren:

Skrivekonflikt
Denne post er blevet ændret af en anden bruger, efter du begyndte at redigere den. Hvis du gemmer posten nu, overskriver du den anden brugers ændringer.
Hvis du kopierer ændringerne til udklipsholder, kan du bagefter se, hvad den anden bruger har indtastet og evt. indsætte dine egne ændringer, hvis du vil foretage ændringer.

Knappen Gem post er nedtonet, Kopier til udklipsholder og Annuller ændringer er aktive.

Da vedkommende var ved at indtaste data, havde jeg tabellen åben i MMC, i designvisning, for at ændre et felts egenskaber (allow null).
Anden gang vedkommende fik samme fejlmeddelelse, havde jeg igen åbnet tabellen i MMC, men havde IKKE foretaget nogle ændringer.
Er det sådan i SQL Server, at man ikke kan foretage ændringer til tabelstrukturen, uden at brugernes indtastninger bliver "fucked up"?
Avatar billede trer Nybegynder
12. december 2003 - 10:56 #1
Det der sker er, at din klientapplikation opdager, at der er sket en ændring i den post som er i databasen siden den blev læst. Det kaldes "Lost update" - og det er det den forsøger at undgå.

Lost update er et velkendt "problem" i flerbruger-systemer - en nem løsning er at bruge MTS'en. Den tillader dig at designe systemet som et enkeltbrugersystem - men det kører som flerbruger.  Men da du - så vidt jeg husker - bruger Access som frontend, så hjælper det sikkert ikke.

Jeg mener at huske, at når Access læser data i en linked tabel, så overfører den faktisk samtlige rækker til sin egen "buffer".  Muligvis så slipper den derefter sin share-lås på tabellen (det kan undersøges via sp_who2 og sp_lock).

Når access-brugeren så vil gemme sine ændringer, så checker access at data "før" ændringen matcher dem der er i tabellen - netop for at undgå lost update - gør de ikke det, så gives en fejl.

Selve matchningen behøves ikke at foretages med data, men kan ske internt på rowversion der blot fortæller om en række er opdateret.

Du vil nok også komme ud for det mellem brugere - specielt hvis de ikke bruger samme access mdb-fil.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 11:03 #2
Det var godt nok en ordentlig omgang, men........hvad er løsningen på mit problem? Jeg KAN #%¤# ikke være den eneste som vil køre 5-10 brugere på 3 Access XP fronts opmod en SQL Server?!?!?! :(
Avatar billede puppetmaster Nybegynder
12. december 2003 - 11:06 #3
Det med linked tables i Access; jeg har p.t. én Access frontend og én Access backend, 5-6 brugere bruger den samme frontend (i "gamle dage" havde hver bruger deres egen kopi af frontend'en), uden problemer....så hvorfor viser problemet sig så først med SQL Server backend'en (linked)?
Avatar billede puppetmaster Nybegynder
12. december 2003 - 11:18 #4
Nu er både jeg og den anden bruger på og opdaterer i samme tabel, ingen problemer......... :(
Hvad ER der galt?
Avatar billede trer Nybegynder
12. december 2003 - 11:40 #5
Hmm... hvad har du af indeks på tabellen?  Og hvor stor er den ca. i KB?

Endnu en lang omgang; Når SQL Server skal opdatere, så sætter den en lås i tabellen. Den vil forsøge at låse på rækkeniveau, men kan vælge at låse på page (8 KB), ekstent (64kb) niveau eller helt op på tabel-niveau i stedet. Det afhænger af antal rækker opdateret og indeks.

Ved små tabeller er indeks ikke altid en fordel, SQL Server vil fravælge at bruge indeks på tabeller < 64Kb.

Jeg går ud fra, at du har defineret en primær nøgle - ellers vil access nemlig ikke uden videre tillade opdateringer - men hvis du har en where betingelse når du læser data ud - så prøv at lægge et indeks på samtlige kolonner der indgår i where betingelsen. Og sørg for, at den kolonne med størst spredning (flest forskellige værdier ifht antal rækker) står først i indekset.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 11:46 #6
Der er et "autonummeringsfelt", ID, som vist ikke er indekseret (du mener Full-text indexing, ikke også? det er der ingen af felterne der er). Størrelsen på tabellen, hvor ser jeg det? Der er 340 poster, med 15 felter, kun en enkelt er på 255 characters.
Avatar billede trer Nybegynder
12. december 2003 - 11:54 #7
Full-text indeksing er noget helt andet (faktisk en delvist integreret søgemaskine som med mellemrum bygger et katalog op - lidt alle en websøgemaskine).

Det jeg mener er helt almindelige indeks.  Du tager properties på tabellen, og sørger for at lægge indeks på - der er en speciel fane til det.

Du bør have angivet et primary key indeks på den kolonne der er din unikke nøgle (kolonnen må ikke indeholde NULL værdier) - og så et andet indeks som beskrevet.

Muligvis skal du relinke Access tabellen for at Access kan have glæde af indekset.  Du vil i øvrigt så også slippe for at skulle fortælle Access hvilket felt der er nøglefeltet - det kan den selv "se".

Uden indeks overhovedet vil SQL Server være tvunget til at bruge page-locking. Det kan være ganske mange rækker - og med så lille tabel kan det være hele tabellen der låses.

Meget meget kort; Indeks er en sorteret liste (en træstruktur) der indeholder data fra udvalgte kolonner. Databasen kan så udnytte indeks til lynhurtigt at fremfinde og sortere data - og dermed bliver alting nemmere.

Du kan prøve at søge via google på b-træer og b+ træer (den sidste struktur er den normalt brugte i databaser).
Avatar billede puppetmaster Nybegynder
12. december 2003 - 11:55 #8
Det er (tildeles) muligt at indtaste data, men det er ikke tillladt at redigere i data. Hvorfor ikke?
Avatar billede trer Nybegynder
12. december 2003 - 11:57 #9
Eh?  Den fangede jeg ikke...

Hvilke fejl får du?
Avatar billede puppetmaster Nybegynder
12. december 2003 - 12:00 #10
Samme fejlmeddelelse som jeg gjorde ved indtastning af nye data. Det er overhovedet ikke muligt at redigere en post...
Avatar billede puppetmaster Nybegynder
12. december 2003 - 12:01 #11
"Det jeg mener er helt almindelige indeks.  Du tager properties på tabellen, og sørger for at lægge indeks på - der er en speciel fane til det."
De eneste 2 faner jeg har er: General og Full-Text Indexing. (det var derfor jeg spurgte ang. Full-text indexing)
Avatar billede trer Nybegynder
12. december 2003 - 12:02 #12
Ah.. Du skal åbne tabellen i design mode via Enterprise manager, og der har du en property icon du kan klikke på.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 12:03 #13
nååå, du mente indeks for feltet, IKKE tabellen....
Selected Index = primærnøglen for tabellen
Avatar billede puppetmaster Nybegynder
12. december 2003 - 12:04 #14
hmmm...sorry, du havde ret, properties for tabellen, i design mode.
Avatar billede trer Nybegynder
12. december 2003 - 12:04 #15
Nægtelse af redigering; Kan sagtens skyldes låse.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 13:23 #16
Jeg kan udmærket indtaste/redigere data i en anden tabel, som indeholder 237 poster, 12 felter!!! :( :( :(
Avatar billede puppetmaster Nybegynder
12. december 2003 - 13:27 #17
Det eneste jeg kan komme på er at den tabel der ikke kan opdateres har nogle felter af typen bit og float......prøver lige med en anden tabel som indeholder bit og float.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 13:36 #18
KAN det være datatypen bit der laver rod?
Avatar billede trer Nybegynder
12. december 2003 - 14:43 #19
SQL Server har ikke en bit datatype - den har "kun" en TINYINT - så muligvis.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 14:53 #20
:(
Kan jeg så bare "ændre" den i SQL Serveren? (i MMC)
Avatar billede puppetmaster Nybegynder
12. december 2003 - 14:54 #21
Hmmm...i MMC har jeg da ellers mulighed for at vælge typen bit...
Avatar billede puppetmaster Nybegynder
12. december 2003 - 14:57 #22
(den skal indeholde værdien af en checkboks (ja/nej))
Avatar billede trer Nybegynder
12. december 2003 - 15:02 #23
Eh.. ups. Du har ganske ret - skyldes at vi normalt anbefaler at bruge TinyInt på arbejde fremfor bit (du kan lægge indeks på TinyInt),  Værdierne i en BIT i sql server er 1 eller 0 - ikke TRUE eller FALSE.

Check lige hvad flagene TRUE og FALSE bliver til i Access - jeg kan huske at VB i gamle dage brugte 0 for TRUE og -1 for FALSE (eller noget i den retning).
Avatar billede puppetmaster Nybegynder
12. december 2003 - 15:03 #24
Ud af 23 tabeller er det 3 der ikke kan redigeres i og de 3 indeholder alle data af typen bit. :(
Avatar billede puppetmaster Nybegynder
12. december 2003 - 15:06 #25
Hmmmm....hvis jeg åbner tabellen i MMC, er værdierne 0 og 1, men hvis jeg åbner den sammenkædede tabel i Access, er værdierne 0 og -1! :(
Hvordan skal jeg "konvertere" fra bit til tinyint?
Avatar billede puppetmaster Nybegynder
12. december 2003 - 15:09 #26
WADDA YA KNOW?! Jeg ændrede typen fra bit til tinyint i MMC, opdaterede de sammenkædede tabeller og vupti!, nu kan jeg redigere data! :) :) :)
Takker mange gange for hjælpen, trer.
Avatar billede puppetmaster Nybegynder
12. december 2003 - 15:17 #27
Kan det lade sig gøre at lave en stored procedure som kan checke alle tabeller igennem for typen bit og ændre den til tinyint?
Avatar billede trer Nybegynder
12. december 2003 - 15:25 #28
Ja :-)  Men det er nemmere at gøre det i hånden via enterprise manager. Du kan se tabeldefinitionerne i INFORMATION_SCHEMA.COLUMNS

select * from information_schema.columns where datatype='BIT'
Avatar billede puppetmaster Nybegynder
15. december 2003 - 08:20 #29
Ikke dårligt.
Hvis du lige svarer, så du kan få dine point...
Avatar billede puppetmaster Nybegynder
15. december 2003 - 08:20 #30
takker for hjælpen.
Avatar billede trer Nybegynder
15. december 2003 - 08:23 #31
Så lidt, du er altid velkommen (Jeg tror jeg har tjent halvdelen af mine points på dig efterhånden :-)
Avatar billede puppetmaster Nybegynder
15. december 2003 - 08:39 #32
:)
(kom nu med et svar.... :) )
Avatar billede puppetmaster Nybegynder
15. december 2003 - 08:40 #33
Hov! Det var LÆNGE side jeg accepterede dit svar! :( :( :(
(sorry, det ER mandag morgen)
Avatar billede trer Nybegynder
15. december 2003 - 08:42 #34
Helt fint :-) 

For mig betyder morgentræthed at jeg ALTID tager en ekstra backup før jeg laver noget - for ellers kommer jeg bare senere hjem ....
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester