プロジェクト

全般

プロフィール

Backport(バックポート) #1412

opDoctrineQuery::chooseConnection がトランザクションに対応していない

Shogo Kawaharaほぼ14年前に追加. 13年以上前に更新.

ステータス:
Fixed(完了)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2010-07-22
期日:
進捗率:

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)

関連するチケット

関連している OpenPNE 3 - Bug(バグ) #1382: opDoctrineQuery::chooseConnection がトランザクションに対応していない Fixed(完了) 2010-07-22

関係しているリビジョン

リビジョン 061837a8 (差分)
Shinichi Urabe13年以上前に追加

(fixes #1412, BP from #1382) Squashed commit of the following:

commit 22cfedb99f82dbdf094a1cc928109654c094a3e6
Author: touri <>
Date: Fri Aug 6 12:39:40 2010 +0900

(fixes #1412, BP from #1382) Light correction for the review.

commit 37790f17f0131a6fb6faebb982f0f95b00eada73
Author: touri <>
Date: Fri Jul 30 16:21:50 2010 +0900

(fixes #1412, BP from #1382) If between transactions, select Slave DB.

履歴

#1 Rimpei Ogawa13年以上前に更新

  • 対象バージョンOpenPNE 3.6beta4 から OpenPNE 3.6beta5 に変更

#2 Rimpei Ogawa13年以上前に更新

  • 対象バージョンOpenPNE 3.6beta5 から OpenPNE 3.6beta4 に変更

#3 Rimpei Ogawa13年以上前に更新

  • 対象バージョンOpenPNE 3.6beta4 から OpenPNE 3.6beta5 に変更

#4 Shinichi Urabe13年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Shinichi Urabe にセット

#5 Shinichi Urabe13年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 061837a800c070df67b0f3d042eac6ac74248584 で適用されました。

#6 Shinichi Urabe13年以上前に更新

更新履歴 061837a800c070df67b0f3d042eac6ac74248584 で適用されました。

#7 Shinichi Urabe13年以上前に更新

更新履歴 061837a800c070df67b0f3d042eac6ac74248584 で適用されました。

#8 Kousuke Ebihara13年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

元チケットがテスト待ちなのにも関わらずレビューをしてしまいました。せっかく書いたのでこちらに残しておきます。

意図的であればよいのですが、条件がすべて AND なのであれば、 (self::SELECT === $queryType && !$shouldGoToMaster) の括弧は不要です。

個人的にはかえって可読性を落としているように見える(括弧でくくられていることにより括弧内が OR 条件であると誤認する可能性などが考えられます)のですが、このあたりはどちらかと言えば好みの問題で、それよりはむしろ if の条件が長くなってしまっていることのほうを問題視するべきだとは思います。

もっとも、これは OpenPNE 3 や symfony のコード全般にいえる問題であり、ある程度の可読性が保たれていれば条件の長さについては容認されているのが現状です。従って、この修正は問題なしとしてテスト待ちとします。(もし今後、条件が長くなってしまうような場面に遭遇した場合には、積極的にリファクタリングを検討してください)

#9 Hiroki Mogi13年以上前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

このバグが実際発生する箇所がなくテスターテストは困難なため、コードチェックのみでfixedとします。

他の形式にエクスポート: Atom PDF