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
LockRecord = True
If Session("RecordLock") <> "" Then
Call UnlockRecord()
End If
Application.Lock
RecordLocks = Application("RecordLocks")
If Not IsArray(RecordLocks) Then
Redim RecordLocks(0)
RecordLocks(0) = Table & "|" & PrimaryKey & "|"
Else
If UBound(Filter(RecordLocks, Table & "|" & PrimaryKey & "|", True)) = 0 Then
LockRecord = False
Application.UnLock
Exit Function
End If
Redim Preserve RecordLocks(UBound(RecordLocks)+1)
RecordLocks(UBound(RecordLocks)) = Table & "|" & PrimaryKey & "|"
End If
Application("RecordLocks") = RecordLocks
Application.UnLock
Session("RecordLock") = Table & "|" & PrimaryKey & "|"
End Function
Sub UnlockRecord()
Dim RecordLocks
Application.Lock
RecordLocks = Application("RecordLocks")
RecordLocks = Filter(RecordLocks, Session("RecordLock"), False)
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
Else
Response.Write("Record al in gebruik")
End If
...
If Request.Form.Count > 0 Then
...
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.
|