-
Notifications
You must be signed in to change notification settings - Fork 101
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mysql 5.7 でdeadlockが発生 #630
Comments
行の存在を確認してから DELETE するのが良い感じですかね |
そうみたいです |
デッドロックを避け DELETE が走らなかったところで、片方のトランザクションの INSERT は通常キー重複で落ちる気がします。EC-CUBE の動作上はシステムエラーなので少なくともフロントでは差が無い気がします。むしろ落ちずに通ってしまう事があったら、その方が大問題なので、その観点では MySQL は PostgreSQL より安全方向に振った標準設定であり、#1097 はそれを殺す変更になる気がします。 安全方向に振る価値が無く、デッドロックを避けるのが最優先であれば、PostgreSQL 同様に READ COMMITTED にする方がスマートだと思います。 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; #1097 では対応できない DELETE 以外の行ロックとの組み合わせにも対応します。 |
上とは別の観点で、#1097 の手法で行くにしても、PostgreSQL を巻き込まない配慮は可能そうに思います。 |
@seasoftjapan キー重複での INSERT は置いておいて、 DELETE の行を count() で確認すること自体に害は無さそうですが、いかがでしょうか? |
@nanasess PostgreSQLが対象外となれば、当座黙認できる認識です。 MySQLは、後々時間ある時にでも手がけるかもしれませんが、別チケットでOKです。 |
@seasoftjapan DELETE の前に、 DELETE と同じ WHERE の条件で COUNT をコールすると、 PostgreSQL でどんな悪影響が考えられますでしょうか? |
@nanasess 無駄な実行の観点です。 |
あと、count() ではなく、exists() を使った方が良いですね。 |
@nobuhiko 想定シナリオが相違していたようです。 参照先記事のデッドロック例で双方のセッションが しかし、実際には $order_id は異なっていても生じ得ると理解いたしました。異なる場合には、INSERT はキー重複せず落ちないですね。 |
@seasoftjapan |
@seasoftjapan |
無駄ですね。しかし、SELECT するのとコストに差は無い認識でもあります。 |
別の観点で、トランザクションを開いていない場合、MySQL でも無駄となりそうです。 ここまでに挙げた課題について、改善できそうな部分は追って PR しようと思います。 |
備忘録: PostgreSQL では、REPEATABLE READ でも SERIALIZABLE でも、このケースのデッドロックは発生しなかった。 |
- トランザクション分離レベルを意識して、無駄な SQL 実行を避ける。#630 (comment) - 幾らかコストが低い exists() を使う。#630 (comment) - SC_DB_DBFactory のテストが無さそうなので、今回追加したメソッドの他、ごく基本的な部分のみ実装する。
- トランザクション分離レベルを意識して、無駄な SQL 実行を避ける。#630 (comment) - 実行コストが幾らか低い傾向の exists() を使う。#630 (comment) - SC_DB_DBFactory のテストが無さそうなので、今回追加したメソッドの他、ごく基本的な部分を実装する。 - 削除件数を返さない不具合を修正。 - アノテーションを補完。
備忘録: 後続の改善案。今のところ、直ぐやる必要はなく、別チケットで良いと考える。
|
ec-cube2/data/class/helper/SC_Helper_Purchase.php
Line 682 in 6d283fe
mysql 5.7 でdeadlockがまれに発生する可能性がある、らしい
https://www.slideshare.net/yuyamada777/delete-77702365
The text was updated successfully, but these errors were encountered: