[MS-SQL 2000] Exclusive read op een tabel

Pagina: 1
Acties:

  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 07-09-2025
Ik ben al een tijdje aan het prutsen met locks op een tabel/row e.d. Ik krijg het alleen niet goed voor elkaar. Het probleem is als volgt:

Ik werk aan een soort van belapplicatie waar meerdere personen mee werken. Deze lezen klant gegevens uit een klanten tabel en krijgen die vervolgens op het scherm gepresenteerd. Dan pakken ze vervolgens de telefoon om die klant te bellen afspraken maken e.d. en lezen vervolgens het volgende record. Nu moet het zo zijn dat wanneer iemand een record op zijn scherm heeft deze niet meer gelezen kan worden door een andere medewerker.

Dus stel er zijn 10 klanten in een tabel:
De eerste medewerker voert het volgende statement uit: select top 1 * from klanten. Hij krijgt het eerste record op zijn scherm(voert nog geen update uit)

De tweede medewerker voer het zelfde statement uit maar moet niet het eerste maar het tweede record op zijn scherm krijgen. Dus wanneer hij een normale select * from klanten krijgt hij nog maar 9 personen in die lijst.

Heeft iemand enig idee hoe je dit voor elkaar kunt krijgen zonder heel suf op laatste cijfers te selecteren?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Wat jij dus wilt is pessimistic locking.
Ik denk dat je dat zelf zult moeten implementeren: je zult een extra veld moeten toevoegen aan je tabel, en als iemand een record opent, zet je die vlag. Zo geef je dan aan dat iemand anders een record niet meer kan openen.
Van zodra de gebruiker het record sluit, dan reset je die vlag.
Ik weet niet of SQL Server echte andere ondersteuning biedt voor pessimistic locking.
Misschien heb je hier ook wat aan:
klik

Misschien kan je pessimistic row locking ook wel bekomen dmv lock hints.

Je kan je echter ook wel afvragen of pessimistic locking de 'preferred way' is. Optimistic locking icm met een check of het record ondertussen gewijzigd is, is imo beter.
Misschien kan je wel pessimistic locking met een dergelijk statement bekomen:
code:
1
select * from tblklant with (rowlock) where klantid = 1

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
In de SQL Books online kan je ook de andere locking hints vinden.

https://fgheysels.github.io/


Verwijderd

Ik heb iets soortgelijks idd gedaan met een extra veld. Alleen stond in dit veld geen aan/uit vlag, maar ik zette er de huidige tijd + bijv. 10 minuten in. Dat betekent dat het record tot aan die tijd niet gebruikt mocht worden door een ander.

Dit voorkomt records die eeuwig gelockt blijven omdat ze wel opgeroepen, maar nooit afgesloten worden. Iets dat gemakkelijk kan voorkomen als mensen via een webapplicatie de database benaderen, maar of dat het geval is, is niet helemaal duidelijk uit de beschrijving.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Theoretisch kun je het ook gewoon oplossen door de locking mode op Serializable te zetten en gewoon grote transactions toe te staan, maar met ROWVERSION is het wel stukken netter :)

Professionele website nodig?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wat whoami aanvoert is de beste oplossing. Row locks dmv locking hints werkt niet.

SELECT * FROM table WITH (NOLOCK)

:P

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 07-09-2025
Ik snap het niet helemaal(lees: helemaal niet) meer. Volgens jullie en het boekje, books online zou ik met de volgende statements het record moeten locken voor iedereen die tijdens deze transactie het record tracht te lezen:

code:
1
2
3
4
5
6
7
8
9
10
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRANSACTION
    DECLARE @TELLER AS INT
    SELECT @TELLER = 10

    SELECT * FROM T_ASPIRANTRELATIE WITH (ROWLOCK, HOLDLOCK)
    WHERE ASPIRANTRELATIENR = 36
    WAITFOR DELAY @TELLER
COMMIT TRANSACTION


Echter wanneer ik vervolgens in een ander venster van de Query Analyser de volgende statements uitvoer terwijl de eerste nog niet klaar is, komt deze gewoon met het resultaat. De code daarvoor is als volgt:

code:
1
2
3
4
5
6
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRANSACTION
SELECT * FROM T_ASPIRANTRELATIE
    WHERE ASPIRANTRELATIENR = 36
COMMIT TRANSACTION

  • EfBe
  • Registratie: Januari 2000
  • Niet online
je gebruikt dan dezelfde connectie volgens mij. Start eens een andere qa instance op, krijg je dan hetzelfde resultaat?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 07-09-2025
Nee dat maakt niks uit. Ik heb een andere instantie geopend en zelfs met een andere loginnaam op de DB. Het maakt helemaal niks uit. Vandaar dat ik er ook echt geen biet meer van snap
Pagina: 1