我正在使用Access数据库处理VB6应用程序。应用程序不时将消息写入日志表。应用程序的多个实例可能同时运行并区分它们各自具有自己的运行编号。从日志表中推导出运行编号...
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;
我应该怎么做呢?锁定记录集会有什么好处(记录集中的行与数据库中的任何特定行都不匹配)?
答案 0 :(得分:1)
有关添加表的注释是现场注释,但要直接回答您的问题(至少是......),记录锁定策略由Connection对象上的选项控制。检查ADO帮助。
答案 1 :(得分:1)
因为Microsoft Jet数据库 引擎有一个读缓存和懒惰 写道,你可以得到重复的值 如果有两个,请在您的自定义计 应用程序在更短的时间内添加记 而不是缓存刷新 和lazy-write机制来刷新 到磁盘。本文介绍了一个 将这些因素纳入其中的方法 帐户...
How To Implement Multiuser Custom Counters in Jet 4.0 and ADO
答案 2 :(得分:1)
总结我的所有评论到答案(也感谢@MarkJ的初步想法)
您需要创建一个名为tblSession或类似的表。此表将具有自动编号主键,然后是一些帮助字段,例如用户名和机器号等。当应用程序打开时,它会在此表中创建一条记录并读回ID号,然后应用程序将其用作其会话号。由于我们已将ID字段定义为唯一键,因此不会发出重复的数字。