Project

General

Profile

Bug(バグ) #1382

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

Added by Shinichi Urabe over 9 years ago. Updated about 9 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Assignee:
Target version:
Start date:
2010-07-22
Due date:
% Done:

100%

3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)

Description

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)

Related issues

Related to OpenPNE 3 - Backport(バックポート) #1412: opDoctrineQuery::chooseConnection がトランザクションに対応していない Fixed(完了) 2010-07-22
Related to OpenPNE 3 - Backport(バックポート) #1970: opDoctrineQuery::chooseConnection がトランザクションに対応していない Fixed(完了) 2010-07-22

Associated revisions

Revision 89dd8b9a (diff)
Added by Hiroshi Kato over 9 years ago

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

Revision 95d673a8 (diff)
Added by Hiroshi Kato over 9 years ago

(fixes #1382) Light correction for the review.

History

#1 Updated by Shinichi Urabe over 9 years ago

  • Priority changed from Normal(通常) to High(高め)

#2 Updated by Shinichi Urabe over 9 years ago

参考になれば: http://blog.asial.co.jp/673

#3 Updated by Hiroshi Kato over 9 years ago

  • Status changed from New(新規) to Accepted(着手)
  • Assignee set to Hiroshi Kato

#4 Updated by Hiroshi Kato over 9 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

更新履歴 89dd8b9a3cbf66d306a6274dce30116c90bfedf8 で適用されました。

#5 Updated by Shogo Kawahara over 9 years ago

  • Status changed from Pending Review(レビュー待ち) to 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 でも良いはずです。

#6 Updated by Hiroshi Kato over 9 years ago

  • Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)

更新履歴 95d673a8129c4569f6c95f758c79343df631ed83 で適用されました。

#7 Updated by Shogo Kawahara over 9 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

#8 Updated by Rimpei Ogawa about 9 years ago

  • 3.6 で発生するか set to Yes

#9 Updated by Kousuke Ebihara about 9 years ago

  • Priority changed from High(高め) to Normal(通常)

OpenPNE 3.6beta4 およびバンドルプラグインにはこのバグが実際発生する箇所はありません。優先度を下げて取り組みます。

#10 Updated by Hiroki Mogi about 9 years ago

  • Status changed from Pending Testing(テスト待ち) to Fixed(完了)
  • % Done changed from 70 to 100

実装者に確認した際にテスターテスト不可とのことだったので、ステータスをfixedに変更します。

Also available in: Atom PDF