从这样的表中:
ID SEQUENCE
1 1
我想在每次访问表时增加序列值。到目前为止,我想到了这个vbscript:
Dim Result
On Error Resume Next
Result = GetSequential()
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.CreateTextFile("result_" & Result & ".txt", False)
if err.Number <> 0 then
MsgBox err.Description & " (" & Err.Number & "): " & Result
end if
on error goto 0
wscript.echo "Next value: " & Result
Function GetSequential()
Dim cn, rs
Dim Sequential
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.connectionstring = "Driver={MySQL ODBC 5.2a Driver};Server=172.16.0.130;Database=testautostore;User=root;Password=aquilae"
cn.Open
Dim SqlCount
SqlCount = "select count(*) from counter where ID='1'"
rs.Open SqlCount, cn, adOpenStatic
If rs(0) = "1" Then
wscript.echo "Updating record..."
Dim SqlUpdate
SqlUpdate = "update counter set SEQUENCE=SEQUENCE + 1 where ID='1'"
cn.Execute SqlUpdate
Dim SqlSelect
SqlSelect = "select SEQUENCE from counter where ID='1'"
rs.Close
rs.Open SqlSelect, cn, adOpenStatic
Sequential = rs(0)
wscript.echo "Result: " & Sequential
End if
rs.Close
Set rs = Nothing
cn.Close
GetSequential = Sequential
End Function
单独运行时,此方法工作正常:
cscript testsequence.vbs
但是,如果同时运行几次,则不能保证获得唯一的序列号。当启动这样的批处理文件时,这是显而易见的:
for /l %%x in (1, 1, 25) do start cscript testsequence.vbs
由于返回相同的序列值(文件已存在),因此在创建result _ ?. txt文件时会导致异常失败。
因此,问题是如何锁定表更新操作?
提前致谢。
最佳答案
您似乎假设脚本中的更新和读取将是原子的:
进程A更新sequence
进程A读取sequence
进程B更新sequence
进程B读取sequence
但是,MySQL默认情况下已启用自动提交,因此每个语句均由其自身运行,并且来自并发进程的查询可能会混杂在一起:
进程A更新sequence
进程B更新sequence
进程B读取sequence
进程A读取sequence
这样,A和B将读取相同的值,尽管两个进程都将其递增。
您需要将语句放在transaction中并使用适当的isolation level。
关于mysql - 从vbscript锁定表更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14734818/