TL;DR
- Resource Allocation Graph の循環を調べる検出は、リソースの要求と解放のたびに走るので高価である。
- ゴルーチンが複数の排他的リソースを同時に使うユースケースも少ないので、Go のランタイムは完全なデッドロック検出を提供していない。
内容
Resource Allocation Graph の循環を調べてデッドロックを検出する仕組みは、性能の面から見ると高価な処理である。ランタイムはグラフを維持し、リソースの要求や解放が起きるたびに循環がないかを調べる必要がある。多数のゴルーチンがリソースの要求と解放を繰り返すと、そのたびに検出アルゴリズムが走り、処理が遅くなる。また、ゴルーチンが同時に複数の排他的リソースを使うユースケースは少ない。
一方、RDBMS では、検出アルゴリズムがデータベース操作に比べて十分に速く、性能に影響しないので、デッドロックを検出している。