Newsgroup: it.comp.lang.visual-basic
Titolo: Concorrenza nella modifica di un record di un DB

Ciao a tutti,
Ho un problemino con la condivisione dei dati.
Per effettuare le modifiche di un record richiamo sull'evento click di un
pulsante OK la seguente procedura ("qBaseID" e' una query parametrica che
prende un unico argomento: l'ID del record da modificare):
Private Sub DB_Modify()
  Dim recset As ADODB.Recordset
  strSQL = "qBaseID " & AdoBase.Fields("id")
  DB_Connect recset
  DB_OpenStored recset, strSQL
  With recset
    .Fields("name") = frmNewBase.txtName.Text
    .Fields("info") = frmNewBase.txtInfo.Text
    .Update
  End With
  DB_Disconnect recset
  DB_RefreshGrid
End Sub
Public Sub DB_OpenStored(ByRef adoRSet As ADODB.Recordset, _
    strSQL As String)
  adoRSet.CursorLocation = adUseServer
  adoRSet.Open strSQL, connConnection, _
        adOpenStatic, adLockPessimistic, _
        adCmdStoredProc
End Sub
Il problema e' che riesco ad effettuare due modifiche allo stesso record (da
due postazioni) come se fossero fatte sequenzialmente (quando in realtà c'e'
lo spazio di meno di un secondo fra le due modifiche). Forse il
comportamento e'
normale, ma non va granche' bene: in questa maniera un utente non e' sicuro
che le modifiche che sta apportando non vengano sovrascritte da un altro
utente che sta accedendo contemporaneamente allo stesso record...
Se tengo la connessione aperta, il problema e' l'intasamento della rete. Se
la tengo chiusa, il problema e' la modifica dei record.
Se leggessi il record prima di modificarlo (nella procedura DB_Modify()),
per
accertarmi che sia quello originale e non sia stato modifcato da qualcun
altro, sarebbe sufficiente? Mi darebbe la sicurezza che effettivamente non
sia poi modificato da un altro utente nello spazio di tempo che intercorre
tra la lettura e la successiva modifica?
Nel mio caso particolare non penso che un record verrà mai modificato da
piu' utenti contemporaneamente (o per lo meno lo sarà molto raramente,
credo), pero' la domanda mi e' sorta e mi domando quale sia il codice VB per
gestire un DB in cui accedono in modifca sugli stessi record (non aggiunta)
molti utenti contemporaneamente...
Vorrei sottolineare che le prestazioni della rete non devono degradarsi con
il numero di connessioni aperte...
Grazie anticipatamente a chi si leggerà tutta sta pappardella, a chi ci
capirà qualcosa e a chi avrà voglia di rispondere... :)
E scusate la prolissità...

Per il momento ho "risolto" un po' rozzamente modificando la procedura di
modifica come segue (il recordset AdoBase e' un recordset disconnesso aperto
precedentemente):
Private Sub DB_Modify()
  Dim recset As ADODB.Recordset
  strSQL = "qBaseID " & AdoBase.Fields("id")
  USODB_Connect recset
  USODB_OpenStored recset, strSQL, False
  If AdoBase.Fields("name") <> recset.Fields("name") Or _
      AdoBase.Fields("info") <> recset.Fields("info") Then
    USODB_Disconnect recset
    MsgBox "The record has been modified by another user!"
  Else
    With recset
      .Fields("name") = frmNewBase.txtName.Text
      .Fields("info") = frmNewBase.txtInfo.Text
      .Update
    End With
    USODB_Disconnect recset
  End If
  DB_RefreshGrid
End Sub
Ma non so se questo sia il modo di procedere piu' appropriato...