Bug(バグ) #1382
完了opDoctrineQuery::chooseConnection がトランザクションに対応していない
100%
説明
opDoctrineQuery::chooseConnection がトランザクションに対応していません。
select とその他のクエリの種類のみでコネクションの選択が行われているため、トランザクションを使用した場合、ORMでは、データの更新後、すぐに情報を取得しモデルを最新の状態にしますが、そのコネクションが異なるため、更新されていないデータを取得、またはデータが取得できずに、モデルの中の状態がおかしなことになり、エラーが表示されることがあります。
同じデータベースを参照する database.yml を書いて検証しました。
all: slave_1: class: sfDoctrineDatabase param: dsn: 'mysql:dbname=testtest;host=localhost' username: root encoding: utf8 attributes: { 164: true } priority: 2 doctrine: class: sfDoctrineDatabase param: dsn: 'mysql:dbname=testtest;host=localhost' username: root encoding: utf8 attributes: { 164: true } priority: 2
クエリが実行される前に 接続先をログに出力するように変更し、ログを取得しました。
7月 21 22:27:55 symfony [debug] con:doctrine 7月 21 22:27:55 symfony [info] {Doctrine_Connection_Statement} execute : UPDATE member_profile SET value = ? WHERE id = ? - (2, 2400) 7月 21 22:27:55 symfony [debug] con:slave_1 7月 21 22:27:55 symfony [debug] con:slave_1 7月 21 22:27:55 symfony [info] {Doctrine_Connection_Statement} execute : SELECT m.id AS m__id, m.member_id AS m__member_id, m.profile_id AS m__profile_id, m.profile_option_id AS m__profile_option_id, m.value AS m__value, m.value_datetime AS m__value_datetime, m.public_flag AS m__public_flag, m.tree_key AS m__tree_key, m.lft AS m__lft, m.rgt AS m__rgt, m.level AS m__level, m.created_at AS m__created_at, m.updated_at AS m__updated_at FROM member_profile m WHERE (m.id = ?) LIMIT 1 - (2400)
Hiroshi Kato さんが14年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 89dd8b9a3cbf66d306a6274dce30116c90bfedf8 で適用されました。
Shogo Kawahara さんが14年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
細かい問題ですが
1.
elseif (0 == self::getMasterConnection()->transaction->getState() && (self::SELECT === $queryType && !$shouldGoToMaster))
getState() は integer のみしか返さないので、 === を利用するべきでしょう。さらに、0 ではなく Doctrine_Transaction::STATE_SLEEP を使うべきでしょう。
2.
elseif ならば、125行目の空行はないほうがいいでしょう。
もしくは、この前に行なっている if で条件にマッチした場合 return するため ここでは elseif ではなく if でも良いはずです。
Hiroshi Kato さんが14年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 95d673a8129c4569f6c95f758c79343df631ed83 で適用されました。
Shogo Kawahara さんが14年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Kousuke Ebihara さんが14年以上前に更新
- 優先度 を High(高め) から Normal(通常) に変更
OpenPNE 3.6beta4 およびバンドルプラグインにはこのバグが実際発生する箇所はありません。優先度を下げて取り組みます。
Hiroki Mogi さんが14年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
実装者に確認した際にテスターテスト不可とのことだったので、ステータスをfixedに変更します。