3


1

SQLトランザクション:TSQL対VB.NET?

いずれかのアプリケーションの厄介なタイムアウトバグを追跡しています。

TSQLステートメントを使用してストアドプロシージャに書き込まれた場合と、アプリケーション内でSQLトランザクションを使用した場合の違いを知りたいと思いました。 これを機能させるには、ストアドプロシージャとvbコードを再構築する必要がありますが、現時点で努力する価値があるかどうかはわかりません。

Public Sub RetrieveTData(ByVal cID As String, ByVal cnn As SqlConnection) As Boolean

    Dim sqlTran As SqlTransaction
    cnn.Open()
    sqlTran = cnn.BeginTransaction

    Try
        If Not DataAlreadyTransferred(cID) Then

            Dim Command As New SqlCommand("usp_BigNasty_CopyDataFromDB1toDB2")
            Command.CommandType = CommandType.StoredProcedure
            Command.Transaction = sqlTran
            Command.Parameters.AddWithValue("@cID", cID)
            Command.Connection = cnn

            Command.ExecuteNonQuery()
            sqlTran.Commit()
        Endif

    Catch ex As Exception
        sqlTran.Rollback()
        Throw
    Finally
        cnn.Close()
    End Try

End Sub

try / catchの記述方法により、タイムアウトが `DataAlreadyTransferred()`または `usp_BigNasty_CopyDataFromDB1toDB2`で発生しているかどうかはわかりません。 このコードを再構築できますが、本番環境に移行するのに1週間ほどかかります(今日はtest / devでエラーは発生しません)

DB1-他のアプリケーションでも使用される永続ストレージ+ DB2-Web Appでのみ使用されるワーキングセット

`DataAlreadyTransferred(cID)`は、DB2がレコードのコピーを持っているかどうかを最初にチェックします。DB2があり、それらのレコードがクリーンである場合、それらを削除します(DB1でデータが変更された可能性があり、最新バージョンが必要です)。 DB2のデータがダーティである場合、そのまま残され、データは削除されません。

`usp_BigNasty_CopyDataFromDB1toDB2`は、約20〜30の異なるテーブルから行をコピーし、DB1からDB2にpermコピーをコピーします。基本的に、Webアプリがアクセスできるワーキングセットを作成します

これは非効率的であると認識しており、改善する方法を検討していますが、まだ時間がありません…​

アプリコードにトランザクションを含めることで、本当に必要な数よりも多くのテーブルがロックされると思います。 それらをストアドプロシージャに移動すると、一度にロックされるテーブルが減るため、今日発生しているデッドロック状態/タイムアウトの問題を除去する可能性が向上します。 これについてはよくわかりません。

ご意見ありがとうございます。

2 Answer


1


トランザクションは、往復と複数の呼び出しで必要以上に長く開いています。

and cleans and writes = 1つのアトミックコールをテストする単一のストアドプロシージャをお勧めします。

また、データをほぼリアルタイムでライブに保つためのレプリケーション、またはDB2に多くのDB1が含まれる場合はミラーリングも検討します。 DBエンジンに実行させますか?


0


さらなる調査の結果、関連するテーブルの多くにインデックスがないことがわかりました。 このプロセスに関係するクエリの推奨インデックスを作成した後、タイムアウトの問題は解消されたようです(今のところ)。

私は、このプロセス全体の最適化を検討しています。それは、データ量が非常に遅いためです。