Avatar billede mini-me Nybegynder
27. juli 2009 - 20:30 Der er 10 kommentarer

Hvordan sikre jeg mig mod duplicate id's

Hej,

Jeg har et problem, som jeg er sikker på der er nogen der kan hjælpe med.

Jeg er igang med at udvikle en shopløsning men er stødt på et problem.

Problemet opstår som følge af.:

En kunde går ind på betalingssiden her henter jeg så det højeste ID fra tabellen orders og tilføjer en record - dette sikre at 2 kunder ikke når samme side samtidig og får samme ordreID. Dette ordreID gemmes så i betalingsgatewayen sammen med PBS-transaktions nummer.

Alt sammen meget godt, men lad os tage udgangspunkt i følgende scenario.

Tabellen orders har p.t. orderID 100 som største record.

Der kommer nu en kunde ind på betalingssiden han får tildelt ordreID 101 - men imellemtiden vælger en anden kunde at lave en bankoverførsel og bruger så ordreID 101.

Dette betyder at når kunden på betalingssiden gennemfører får han en fejl om at der allerede er en record med dette ID (ikke hensynsfuldt)

Hvordan kan jeg "reservere" det her ID i databasen? På den måde ville bankoverførslen få ordreID 102, da ID 101 var "låst" af databasen...
Avatar billede lakridserne Nybegynder
27. juli 2009 - 20:33 #1
Hvad med at allerede når man går ind på betalingssiden så gemmer den bare id'et og tid og dato i databasen (eller hvad det nu kan være) og så senere opdaterer?
Avatar billede mini-me Nybegynder
27. juli 2009 - 20:38 #2
Hvad hvis man vælger ikke at betale alligvel - så har jeg en record i databasen som er unødvendig (og i mit tilfælde ville det give en "tom" ordre - som jeg så skulle til at bøvle med at slette)
Avatar billede arne_v Ekspert
27. juli 2009 - 20:54 #3
Lad SQLServer generere id via IDENTIY kolonne (SELECT MAX(id) duer ikke som du selv har fundet ud af).

Enten sletter du ved manglende fuldfoerelse. Det tror jeg er mest optimalt for dokumentation af hvad der er sket.

Eller saa bundter du alle opdateringerne i en transaktion og laver rollback hvis kunden fortryder.
Avatar billede hrc Mester
27. juli 2009 - 22:26 #4
Brug Identity til primærnøglen og pak ordren ind i en transaktion. Man skal ikke hvad transaktioner kørende fra ordrens start til brugeren afslutter, kun den del der skriver til tabellen skal transaktioneres.

Du blive nok nødt til at lave ordrene uanset om de er tomme eller ej. Burde ikke være svært at sortere fra i en "select". I ordre-recorden kan du have et bit-flag der fortæller om den er annulleret eller ej
Avatar billede mini-me Nybegynder
27. juli 2009 - 22:31 #5
Kan du prøve at komme med noget eksempel-kode på sådan en transaktion?
Avatar billede arne_v Ekspert
28. juli 2009 - 03:48 #6
BEGIN
flere SQL sætninger
COMMIT eller ROLLBACK
Avatar billede hrc Mester
28. juli 2009 - 07:31 #7
Som Arne beskriver er det ikke andet end (det er nu ret meget andet, men det simple svar er vist OK), at man før en eller flere skrivninger til tabellerne laver en "begin trans". Kommandoerne udføres og hvis de går godt bliver alt skrevet i én atomar handling vha. "commit trans". Går det galt rulles tingene tilbage til før transaktionen, her ved kommandoen "rollback trans".

Transaktionens opgave er at sikre, at databasen aldrig ender i den situation hvor der er oprettet en ordre og kun halvdelen af ordrelinjerne er blevet skrevet.

Hver gang du skriver til en tabel bliver der automatisk lavet en transaktion. Det er langsomt og her vindes en masse ydelse ved at pakke transaktionen udenom passende klumper af operationer.

Ang. eksemplet. Hvad laver du programmet i? Er ovenstående T-SQL eksempel nok til at hjælpe dig videre?
Avatar billede hrc Mester
28. juli 2009 - 07:34 #8
Her er der en eksempel på en sproc der bruger transaktioner: http://www.eksperten.dk/spm/882028
Avatar billede mini-me Nybegynder
28. juli 2009 - 12:34 #9
Hej,


Tak for feedback - nu jeg ikke den store SQL haj - men prøver lige at kigge på de eksempler der er givet - og så vender jeg lige tilbage.
Avatar billede arne_v Ekspert
22. august 2009 - 17:04 #10
Kommet videre ?
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