ASPNL logo (1 kb)
Saturday, February 04, 2012




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

Records door één gebruiker tegelijk laten wijzigen in ASP

Door Michiel van Otegem
14 april 2003

Noot: Dit artikel werkt met ASP, er is ook een ASP.NET versie.

Op het web is er geen constante verbinding met een database. Als je een record wilt wijzigen, moet je het eerst opvragen, waarna de databaseverbinding gesloten wordt. Bij het opslaan wordt de database weer geopend, en wordt het record gewijzigd. Het probleem is nu dat als iemand anders tussen het opvragen van de gegevens en het opslaan hetzelfde record opvraagt met de bedoeling het te wijzigen, dat er dan geen indicatie is dat iemand anders met dat record bezig is.

Het hierboven geschetste probleem kun je oplossen door slim gebruik te maken van het Application object en het Session object. In het Application object wordt bijgehouden welke records in gebruik zijn, en in het Session object wordt bijgehouden welk record de gebruiker in gebruik heeft. Het makkelijkste is om hiervoor twee functies te maken die je op verschillende plaatsen kunt gebruiken.

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Function LockRecord(ByVal Table, ByVal PrimaryKey)
   Dim RecordLocks

   'Standaard returnwaarde van de functie
   LockRecord = True

   'Elke sessie mag lock op 1 record tegelijk
   If Session("RecordLock") <> "" Then
      Call UnlockRecord()
   End If

   'Alleenrecht op Application object
   Application.Lock

   'Huidige locks opvragen
   RecordLocks = Application("RecordLocks")

   If Not IsArray(RecordLocks) Then
      'Er zijn nog geen locks, nieuwe array maken
      Redim RecordLocks(0)
      RecordLocks(0) = Table & "|" & PrimaryKey & "|"
   Else
      'Er zijn al locks, kijk of het huidige record beschikbaar is
      If UBound(Filter(RecordLocks, Table & "|" & PrimaryKey & "|", True)) = 0 Then
         'Record al door iemand anders in gebruik
         LockRecord = False
         Application.UnLock
         Exit Function
    End If

      'Lock toevoegen
      Redim Preserve RecordLocks(UBound(RecordLocks)+1)
      RecordLocks(UBound(RecordLocks)) = Table & "|" & PrimaryKey & "|"
   End If

   'Locks opslaan en Application object vrijgeven
   Application("RecordLocks") = RecordLocks
   Application.UnLock

   'Lock toekennen aan deze sessie
   Session("RecordLock") = Table & "|" & PrimaryKey & "|"
End Function


Sub UnlockRecord()
   Dim RecordLocks

   'Alleenrecht op Application object
   Application.Lock

   'Huidige locks opvragen
   RecordLocks = Application("RecordLocks")

   'Lock van deze sessie verwijderen
   RecordLocks = Filter(RecordLocks, Session("RecordLock"), False)

   'Locks opslaan, Application object vrijgeven, en lock verwijderen uit sessie
   Application("RecordLocks") = RecordLocks
   Application.UnLock
   Session("RecordLock") = ""
End Sub
</SCRIPT>

De bovenstaande code bevat twee functies, LockRecord voor het verkrijgen van een record en UnlockRecord voor het vrijgeven van een record. LockRecord geeft True terug als het record verkregen is, en False als het record al in gebruik is door iemand anders. Door deze code in een pagina te plaatsen (eventueel via een include) kun je dus makkelijk records verkrijgen en vrijgeven, zoals te zien in de code hieronder.

If LockRecord("MijnTabel", "1234") Then
   'Record verkregen, dus opvragen en daarna wijzigen
Else
   Response.Write("Record al in gebruik")
End If

...

If Request.Form.Count > 0 Then
   'Record opslaan
   ...
   UnlockRecord
End If

Er zit nu nog een addertje onder het gras, namelijk dat een record in gebruik blijft als iemand de browser afsluit (of naar een andere pagina gaat) voordat het record is vrijgegeven. Om dit te voorkomen moet je in ieder geval zorgen dat het gebruikte record vrijgegeven wordt als de sessie van de betreffende gebruiker verloopt. Je kunt dit doen in de Session_OnEnd gebeurtenis in global.asa.


<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL