0

このようなテーブルから:

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 ファイルを作成するときに例外エラーが発生します (ファイルは既に存在します)。

問題は、テーブルの更新操作をロックするにはどうすればよいかということです。

前もって感謝します。

4

1 に答える 1

1

スクリプトの更新と読み取りはアトミックであると想定しているようです。

  • プロセス A の更新sequence
  • プロセスAの読み取りsequence
  • プロセス B の更新sequence
  • プロセス B の読み取りsequence

ただし、MySQL では自動コミットがデフォルトで有効になっているため、各ステートメントは単独で実行され、同時プロセスからのクエリが混在する可能性があります。

  • プロセス A の更新sequence
  • プロセス B の更新sequence
  • プロセス B の読み取りsequence
  • プロセスAの読み取りsequence

そうすれば、両方のプロセスでインクリメントされますが、A と B は同じ値を読み取ります。

ステートメントをトランザクションに入れ、適切な分離レベルを使用する必要があります。

于 2013-02-06T21:07:06.600 に答える