2

以下を使用してShared FunctionDB から値を選択しています。私の懸念は、共有関数がすべてのオブジェクト間で共有されるため、2 人がほぼ同時に関数を実行すると、データが上書きされる可能性があることです??

DB から返される値は、最後の (最新の) 実行の結果になるということですか?

例えば:

ユーザー 1 は関数を実行し、"abcd"を取得する必要 があります ユーザー 2 は関数を実行し、"1234"を取得する必要があります

ユーザー 2 は、ユーザー 1 が関数の実行を完了する前に関数を実行します。

ただし、両方のユーザーが「1234」を取得します

Public Shared Function SelectScalar(ByVal _sql As String, ByVal _parameterNames() As String, ByVal _parameterVals() As String) As String
            Dim _returnVal As String
            Dim _connection As SqlConnection = Global.Connection.GetDbConnection()
            Dim _command As New SqlCommand(_sql, _connection)
            Dim _value As String

            Try
                If _parameterNames IsNot Nothing Then
                    For i = 0 To _parameterNames.Length - 1
                        _command.Parameters.AddWithValue(_parameterNames(i), _parameterVals(i))
                    Next
                End If

                _value = CStr(_command.ExecuteScalar)
                _returnVal = _value
            Catch ex As Exception
                _returnVal = Nothing
            Finally
                If _connection.State = ConnectionState.Open Then
                    _connection.Close()
                    _connection.Dispose()
                    _command.Dispose()
                End If
            End Try

            Return _returnVal
        End Function
4

4 に答える 4

1

Shared Functionsは、のように「内部」状態を共有しません_returnVal。メソッドが呼び出されるたびにすべてのローカル変数の個別のインスタンスが作成され、各呼び出しは独自の変数のセットを追跡します。変数が内で宣言されている場合、クロストークは発生しませんShared Function

于 2012-07-01T18:55:47.820 に答える
0

この場合、それは問題にはなりません。は_returnValローカルであるため、各発信者は独自のを取得し_returnValます。それぞれが独自のローカルを持っているので、それらが同時に実行されるかどうかは関係ありません。

呼び出し元が共有するクラスフィールドに結果を書き込んでいる場合は、言及した問題が発生する可能性があります。

于 2012-07-01T18:55:53.430 に答える
0

他のすべての回答で述べたように、2 つの同時呼び出しに同じ接続を提供Global.Connection.GetDbConnection() しないと仮定すると、問題ありません。

複数の呼び出しが同じ接続インスタンスを取得する場合、1 つの呼び出しが完了する前に接続が閉じられるという競合状態が発生する可能性があります。

于 2012-07-03T06:47:27.440 に答える
0

このシナリオ (データ アクセス方法の同時実行) では、ユーザーに表示される内容を決定するのはコードではなく、データベースの構成方法、クエリの分離レベルです。

SQL Server で利用可能なオプションについては、MSDN のSET TRANSACTION ISOLATION LEVEL (Transact-SQL)を読むことをお勧めします。

于 2012-07-01T18:55:28.303 に答える