1

私はこのコードを試しています:

        foreach (var r in _vm.Rules.Take(20)) {
            Task.Factory.StartNew(() => {
                new SQLRuleSerializer().SaveRule(_vm.SelectedKey, r);
            });             
        }

エラー:

トランザクション (プロセス ID 600) は、別のプロセスとのロック リソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。

明示的なロックがないことを考えると、これがどのようにデッドロックしているのか正確にはわかりません..問題は、シリアライザーがプロキシであり、別々のインスタンスを介しても並行して呼び出すことができないことだと思いますか?

4

2 に答える 2

9

トランザクション (プロセス ID 600) は、別のプロセスとのロック リソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。

デッドロックは、C# コードではなく、SQL Server から発生しています。

于 2012-06-12T18:07:52.693 に答える
1

20の異なるルールを並行して保存しようとしていますが、保存するたびにSQLサーバーでいくつかのロックが必要なようです。これは、並列化ではほとんど利益がないことを意味するため、TPLを使用せずに通常のループを使用する必要があります。

于 2012-06-12T18:32:27.643 に答える