![]() |
![]() |
Suatu program MultiUser sangat tergantung pada bagaimana file database sebagai sumber daya yang digunakan dapat dibuka oleh lebih dari satu pemakai pada saat yang bersamaan.
Pengaturan modus pembukaan file database pada Data kontrol dapat dilakukan dengan menentukan nilai dari properti Exclusive menjadi True (Single User) atau False (Multi User).
Sesuatu hal yang perlu diperhatikan dalam pengaktifan file Database secara Share (Exclusive False) adalah mekanisme penguncian ketika data di Edit. Mekanisme penguncian pada Data kontrol dapat menggunakan dua jenis strategi, yaitu :
Pemakaian strategi penguncian ini dapat ditentukan pada Properti LockEdits dengan mengubah nilainya menjadi True (Pesimistik Locks) atau False (Optimistik Locks).
Contoh :
Private Sub Form_Load() RsForum.Refresh RsForum.Recordset.LockEdits = True 'Menggunakan Strategi Pesimistik Locks End Sub
Catatan :
Penguncian dilakukan oleh Visual Basic secara per Page (Halaman) dimana terdiri
dari 2 Kilobyte Page dimana record tersebut berada. Pada saat suatu Page sedang
dikunci, maka usaha penguncian oleh pemakai lain terhadap data lain yang berada
pada Page yang sama akan gagal.
Perhatikan kembali potongan program berikut yang diambil dari Latihan 3 Modul 9, dimana mekanisme masing-masing Locks dapat dijelaskan sebagai berikut :
Private Sub cmdEdit_Click()
Flag = flEdit
RsForum.Recordset.Edit
' Penguncian terjadi disini pada Pesimistik Locks
Call Kunci(False)
Call AturTombol(False, False, False, True, True)
End Sub
Private Sub cmdUpdate_Click()
On Error GoTo ErrUpdate_click
If txtForumID.Text = "" Then
MsgBox "Forum ID tidak boleh kosong", vbCritical,
"Warning"
Exit Sub
End If
If txtKeterangan.Text = "" Then
MsgBox "Keterangan tidak boleh kosong", vbCritical,
"Warning"
Exit Sub
End If
If txtAlamat.Text = "" Then
MsgBox "Alamat tidak boleh kosong", vbCritical,
"Warning"
Exit Sub
End If
RsForum.Recordset.Update
' Penguncian terjadi disini pada Optimistik Locks
Flag = flNone
Call Kunci(True)
Call AturTombol(True, True, True, False, False)
RsForum.Recordset.Bookmark = RsForum.Recordset.LastModified
Exit Sub
ErrUpdate_click:
Select Case Err.Number
Case 3022
MsgBox "Telah terjadi duplikasi pada Forum ID",
vbOKOnly + vbInformation, "Warning"
Case Else
MsgBox Err.Number & vbCrLf & Err.Description
End Select
End Sub
Pada Pesimistik Locks, penguncian dilakukan sesaat setelah metoda Edit, dan penguncian dibuka kembali sampai metoda Update maupun Cancel Update, sedangkan Optimistik Locks, penguncian dilakukan sesaat metoda Update dilakukan.
Masalah pada Pesimistik Locks adalah kegagalan penguncian karena Page sedang dikunci oleh pemakai lain, sehingga permintaan Locks pada saat Edit (Pesimistik) maupun Delete gagal dilakukan.
Anda dapat menggunakan Error Handling untuk menangani kegagalan ini dengan mengevaluasi nilai Err yang dihasilkan, dalam hal ini adalah 3260.
Contoh :
Private Sub cmdEdit_Click() On Error GoTo ErrcmdEdit_Click Flag = flEdit RsForum.Recordset.Edit 'Sumber Error pada Pesimistik Locks Call Kunci(False) Call AturTombol(False, False, False, True, True) CancelcmdEdit: Exit Sub ErrcmdEdit_Click: Select Case Err 'Data telah dihapus pemakai lain Case 3167 MsgBox "Data telah dihapus pemakai lain" & vbCrLf & _ "Lakukan refresh data anda !", vbOKOnly + vbInformation 'Data Page (2 kb) telah dikunci oleh pemakai lain Case 3260 nHitung = nHitung + 1 'Memungkinkan pemakai membuat keputusan ulangi 'Penguncian atau batal, maksimum 2 kali If nHitung > 2 Then nPilih = MsgBox("Ulangi penguncian ?", vbYesNo + _ vbQuestion) If nPilih = vbYes Then nHitung = 1 Else Resume CancelcmdEdit End If End If DoEvents 'menjalankan event windows 'menunda sejumlah waktu random nTunda = nHitung ^ 2 * Int(Rnd * 3000 + 1000) For i = 1 To nTunda: Next i Resume Case Else MsgBox "Error " & Err & ":" & Error, vbOKOnly Resume CancelcmdEdit End Select End Sub
Private Sub cmdDelete_Click() On Error GoTo ErrCmdDelete_Click RsForum.Recordset.Delete 'Sumber Error pada Pesimistik Locks RsForum.Recordset.MoveNext If RsForum.Recordset.EOF Then RsForum.Recordset.MoveLast 'Sumber Error kalau data telah habis End If CancelcmdDelete: Exit Sub ErrCmdDelete_Click: Select Case Err.Number 'Data telah kosong Case 3021 MsgBox "Data telah kosong", vbOKOnly + vbInformation, "Warning" 'Data Page (2 kb) telah dikunci oleh pemakai lain Case 3260 MsgBox "Data dikunci user lain, hapus tidak dapat dilakukan !", vbOKOnly + vbInformation Resume CancelcmdDelete Case Else MsgBox "Error" & Err.Number & vbCrLf & Err.Description End Select End Sub
Masalah pada Optimistik Locks adalah kegagalan penguncian karena Page sedang dikunci oleh pemakai lain, sehingga permintaan Locks pada saat Update (Optimistik) gagal dilakukan, ataupun data telah diubah oleh pemakai lain sejak metoda Edit, karena pada Optimistik Locks, tetap terbuka pemakai lain melakukan Edit terhadap data yang sama.
Anda dapat menggunakan Error Handling untuk menangani kegagalan ini dengan mengevaluasi nilai Err yang dihasilkan, dalam hal ini adalah 3260 (kegagalan penguncian) dan 3197 (data telah berubah sejak metoda edit). Untuk merefresh data yang telah berubah, anda dapat menggunakan metoda Move 0.
Contoh :
Private Sub cmdUpdate_Click() On Error GoTo ErrcmdUpdate_click If txtForumID.Text = "" Then MsgBox "Forum ID tidak boleh kosong", vbCritical, "Warning" Exit Sub End If If txtKeterangan.Text = "" Then MsgBox "Keterangan tidak boleh kosong", vbCritical, "Warning" Exit Sub End If If txtAlamat.Text = "" Then MsgBox "Alamat tidak boleh kosong", vbCritical, "Warning" Exit Sub End If RsForum.Recordset.Update 'Sumber Error Pada Optimistik Locks Flag = flNone Call Kunci(True) Call AturTombol(True, True, True, False, False) RsForum.Recordset.Bookmark = RsForum.Recordset.LastModified CancelcmdUpdate: Exit Sub ErrcmdUpdate_click: Select Case Err.Number 'Terjadi duplikasi pada Primary Key Case 3022 MsgBox "Telah terjadi duplikasi pada Forum ID", vbOKOnly + vbInformation, "Warning" 'Data telah dihapus pemakai lain Case 3167 MsgBox "Data telah dihapus pemakai lain" & vbCrLf & _ "Lakukan refresh data anda !", vbOKOnly + vbInformation 'Data telah berubah sejak metoda Edit Case 3197 'Data pada recordset telah berubah 'sejak ditampilkan. MsgBox "Data telah diubah oleh pemakai lain !", vbOKOnly + vbInformation 'Hal ini secara otomatis akan menyegarkan 'kembali recordset untuk menampilkan data terakhir RsForum.Recordset.Move 0 Resume CancelcmdUpdate 'Data Page (2 kb) telah dikunci oleh pemakai lain Case 3260 'Record dikunci pemakai lain nHitung = nHitung + 1 'Mencoba mengunci dua kali 'Memungkinkan pemakai membuat keputusan ulangi, batal If nHitung > 2 Then nPilih = MsgBox("Data sedang dikunci pemakai lain" & vbCrLf & _ "Ulangi penguncian ?", vbYesNo + _ vbQuestion) If nPilih = vbYes Then nHitung = 1 Else Resume CancelcmdUpdate End If End If DoEvents 'menjalankan event windows 'menunda sejumlah waktu random nTunda = nHitung ^ 2 * Int(Rnd * 3000 + 1000) For i = 1 To nTunda: Next i Resume Case Else MsgBox "Error " & Err & ":" & Error, vbOKOnly Resume CancelcmdUpdate End Select End Sub
Suatu Recordset jenis Tabel mengambil data dari suatu tabel, anda dapat melakukan tambah, perbaiki maupun hapus data dari tabel, Hanya record yang aktif yang dimuat ke memori. Sehingga perubahan, penambahan dan penghapusan data oleh pemakai lain dapat langsung diakses.
Recordset jenis Dynaset adalah himpunan dari record-record secara dinamis yang dapat mengandung field-field dari satu atau lebih tabel maupun query yang dapat di update. Ketika user mengupdate data, maka tabel yang berkaitan akan berubah. Pada lingkungan MultiUser, perubahan data tersebut dapat langsung diakses, tetapi jika seorang user melakukan penambahan data, data tersebut tidak akan kelihatan sama user lain, sampai pemakaian metoda Requery (pada Data Kontrol digunakan Refresh). Jika seorang user menghapus suatu record, user lain akan diberitahu ketika akan mengakses record tersebut.
Contoh :
Private Sub cmdRefresh_Click() RsForum.Refresh End Sub
Latihan 1, Pengaturan Program MultiUser dengan Pesimistik Locks
Latihan 2, Pengaturan Program MultiUser dengan Optimistik Locks
Latihan 3, Judul : Mencoba Dynaset di lingkungan MultiUser