Windows Server 2003 と SQL Server 2000 で何年も問題なく実行されているシステムがあります。最近、システムを Windows Server 2008 R2 および SQL Server 2008 R2 に移行したところ、非常に奇妙な断続的な問題が発生し始めました。
ID 列を持つテーブルに行を挿入し、select を実行して ID 値を取得しています。ほとんどの場合、このコードは問題なく動作しますが、ランダムな間隔で ID が返されません。行が見つからないためdr.Read
に false が返されることもあれば、行が返されても ID 列が含まれていないこともあります。データベースを確認したところ、挿入は成功しました。ID が返されなかっただけです。テーブルにトリガーはありません。
また、SQLを次のように変更してみました:
INSERT INTO test (value)
VALUES (100)
SELECT SCOPE_IDENTITY() AS 'identity' OPTION (MAXDOP 1)
「最大並列度」バグに遭遇した場合に備えて、それも役に立ちませんでした。
関連するコードは次のとおりです(説明のために少し簡略化されています):
Dim dr As SqlDataReader = Nothing
Dim objCommand As New SqlCommand
Dim oConn As New SqlConnection
Dim id as integer
oConn.ConnectionString = connStr
oConn.open()
objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100) SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)
try
dr = objCommand.ExecuteReader
If Not dr.Read Then
Throw (New Exception("Could not read IDENTITY"))
Else
id = dr("identity")
End If
Catch
Throw
Finally
If Not dr Is Nothing Then dr.Close()
oConn.close()
End Try