0

同時に実行されることがある2つのプロセスがあります。

最初の 1 つは一括挿入です

using (var connection = new SqlConnection(connectionString))
            {
                var bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.TableLock)
                                   {DestinationTableName = "CTRL.CTRL_DATA_ERROR_DETAIL",};
                connection.Open();
                try
                {
                    bulkCopy.WriteToServer(errorDetailsDt);
                }
                catch (Exception e)
                {
                    throw new Exception("Error Bulk writing Error Details for Data Stream ID: " + dataStreamId +
                                        " Details of Error : " + e.Message);
                }
                connection.Close();
            }

2 つ目は、ストアド プロシージャからの一括更新です。

-- ストアド プロシージャのコードの一部 --

UPDATE [CTL].[CTRL].[CTRL_DATA_ERROR_DETAIL]
            SET [MODIFIED_CONTAINER_SEQUENCE_NUMBER] = @containerSequenceNumber
              ,[MODIFIED_DATE] = GETDATE()
              ,[CURRENT_FLAG] = 'N'
            WHERE   [DATA_ERROR_KEY] = @DataErrorKey
                AND [CURRENT_FLAG] ='Y'

最初のプロセスは少しの間実行され (着信レコードのロードによって異なります)、2 番目のプロセスは常にデッドロックの犠牲になります。

SqlBulkCopyOptions.TableLockリソースが解放されるまで 2 番目のプロセスが待機するように設定する必要がありますか。

4

1 に答える 1

2

デフォルトでは、SqlBulkCopy は排他ロックを取得しないため、実行中にデータを挿入すると、更新プロセスが開始され、デッドロックが発生します。これを回避するには、SqlBulkCopy に、既に提案したように排他的なテーブル ロックを取得するように指示するか、一括挿入のバッチ サイズを妥当な数に設定することができます。

それを回避できる場合は、テーブルロックのアイデアが最良の選択肢だと思います。

于 2011-09-23T22:54:23.367 に答える