Как мне заблокировать таблицу в этом приложении VB6 / Access? - PullRequest
3 голосов
/ 05 января 2011

Я работаю над приложением 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;

Как мне поступить так?Будет ли блокировка набора записей полезной (строка в наборе записей не соответствует какой-либо конкретной строке в базе данных)?

Ответы [ 3 ]

1 голос
/ 06 января 2011

Поскольку база данных Microsoft Jet двигатель имеет кэш чтения и ленив пишет, вы можете получить повторяющиеся значения в вашем пользовательском поле счетчика, если два приложения добавляют записи за меньшее время чем требуется для обновления кэша и ленивый механизм записи для смыва на диск. Эта статья представляет метод, который принимает эти факторы в счет ...

Как реализовать многопользовательские пользовательские счетчики в Jet 4.0 и ADO

1 голос
/ 07 января 2011

Чтобы суммировать все мои комментарии в ответ (также спасибо @MarkJ за первоначальную идею)

Вам необходимо создать таблицу с именем tblSession или аналогичной. Эта таблица будет иметь первичный ключ автономного номера, а затем несколько вспомогательных полей, таких как имя пользователя и номер компьютера и т. Д. Когда приложение открывается, оно создает запись в этой таблице и считывает идентификационный номер, приложение затем использует его в качестве номера сеанса , Поскольку мы определили поле идентификатора как уникальный ключ, оно не будет выдавать повторяющиеся номера.

1 голос
/ 05 января 2011

Комментарии о добавлении таблицы точны, но чтобы напрямую ответить на ваш вопрос (вроде, по крайней мере ...), стратегия блокировки записей контролируется параметрами объекта Connection.Проверьте справку ADO.

...