デッドロックは、各スレッドが 1 つのトランザクションで複数の行を更新しようとしており、それらの更新がスレッド間で異なる順序で行われていることを意味します。したがって、最も簡単な答えは、同じトランザクション内のメッセージが定義された順序 (つまり、主キーの順序) で適用されるようにコードを変更することです。これにより、あるスレッドが別のスレッドがそのトランザクションをコミットするのを待っている間にブロッキング ロックが発生するにもかかわらず、デッドロックが発生することはありません。
ただし、一歩引いてみると、更新の順序を予測できない場合に、多くのスレッドがテーブル内の同じ行を更新することを実際に望んでいるとは思えません。多くの更新が失われ、予期しない動作が発生する可能性が非常に高いようです。正確には、あなたのアプリケーションは、この種のことを理にかなったものにするために何をしていますか?詳細テーブルに行を挿入した後に集計テーブルを更新するようなことをしていますか (つまり、特定のビューに関する情報をログに記録することに加えて、投稿のビュー数のカウントを更新します)?もしそうなら、それらの操作は本当に同期する必要がありますか?または、過去 N 秒間のビューを集計して、別のスレッドでビュー カウントを定期的に更新できますか?