gpt4 book ai didi

mysql - 来自 vbscript 的表更新锁定

转载 作者:行者123 更新时间:2023-11-29 14:03:24 24 4
gpt4 key购买 nike

从这样的表中:

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 更新序列
  • 进程 A 读取序列
  • 进程 B 更新序列
  • 进程 B 读取序列

然而,MySQL 默认启用自动提交,因此每个语句都单独运行,来自并发进程的查询可能会混合在一起:

  • 进程 A 更新序列
  • 进程 B 更新序列
  • 进程 B 读取序列
  • 进程 A 读取序列

这样 A 和 B 将读取相同的值,尽管两个进程都会递增它。

您需要将您的语句放在 transaction 中并使用适当的isolation level .

关于mysql - 来自 vbscript 的表更新锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14734818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com