traPtitech / NeoShowcase

PaaS (Platform as a Service) on Docker 🐳 or k8s ☸
MIT License
53 stars 4 forks source link

環境変数設定時にdeadlockするのを修正 #890

Closed pirosiki197 closed 7 months ago

pirosiki197 commented 7 months ago

なぜやるか

環境変数を一度に複数設定するとdeadlockする deadlock-sample 何回か Save を押せば一応ちゃんと保存される

やったこと

application テーブルでロックをとるようにした

資料

https://zenn.dev/shuntagami/articles/ea44a20911b817

motoki317 commented 7 months ago

根本はsqlboilerで複数unique columnでupsertできないからtransactionを使っているのであって、これが解決できればそちらを使うほうが良さそうですね... (コメントにもある通り: https://github.com/volatiletech/sqlboiler/issues/328

もしくは並列になってる複数リクエストを直列にするか、1つにまとめるように改善するかすると、まず起こることは圧倒的に少なくなりますね https://github.com/traPtitech/NeoShowcase/blob/62dbba3f732316d4390860d56e34e3ecb66c8ae5/dashboard/src/pages/apps/%5Bid%5D/settings/envVars.tsx#L125

その記事読んだことあるけどgap lockの罠を忘れてました gap lockするのあんまりよくないですね https://dev.mysql.com/doc/refman/8.3/en/innodb-locking.html#:~:text=It%20is%20also,must%20be%20merged.

方針としてはapplicationテーブルの方でロックするので良いと思います (次から何か気づいたら、issueから立ててくれると議論などがやりやすいです!)