Я работаю над приложением VB6, используя базу данных Access.Приложение время от времени записывает сообщения в таблицу журнала.Несколько экземпляров приложения могут быть запущены одновременно, и для их различения каждый из них имеет свой собственный номер прогона.Номер прогона выводится из таблицы журнала, таким образом ...
Set record_set = New ADODB.Recordset
query_string = "SELECT MAX(RUN_NUMBER) + 1 AS NEW_RUN_NUMBER FROM ERROR_LOG"
record_set.CursorLocation = adUseClient
record_set.Open query_string, database_connection, adOpenStatic, , adCmdText
record_set.MoveLast
If IsNull(record_set.Fields("NEW_RUN_NUMBER")) Then
run_number = 0
Else
run_number = record_set.Fields("NEW_RUN_NUMBER")
End If
command_string = "INSERT INTO ERROR_LOG (RUN_NUMBER, SEVERITY, MESSAGE) " & _
" VALUES (" & Str$(run_number) & ", " & _
" " & Str$(SEVERITY_INFORMATION) & ", " & _
" 'Run Started'); "
database_connection.Execute command_string
Очевидно, что существует небольшой разрыв между вычислением номера прогона и появлением новой строки в базе данных и предотвращением другойэкземпляр, получающий доступ между двумя операциями, которые я хотел бы заблокировать таблицу;что-то вроде
SET TRANSACTION READ WRITE RESERVING ERROR_LOG FOR PROTECTED WRITE;
Как мне поступить так?Будет ли блокировка набора записей полезной (строка в наборе записей не соответствует какой-либо конкретной строке в базе данных)?