Project

General

Profile

Backport(バックポート) #1970

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

Added by Shinichi Urabe over 8 years ago. Updated over 8 years ago.

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

100%


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 - Bug(バグ) #1382: opDoctrineQuery::chooseConnection がトランザクションに対応していない Fixed(完了) 2010-07-22

History

#1 Updated by Shinichi Urabe over 8 years ago

  • Assignee deleted (Hiroshi Kato)

#2 Updated by Minoru Takai over 8 years ago

  • Status changed from New(新規) to Accepted(着手)
  • Assignee set to Minoru Takai

対応します。

#3 Updated by Minoru Takai over 8 years ago

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

上記でコミットしました。(コミットコメントの形式を誤りました。失礼しました。)

#4 Updated by Shinichi Urabe over 8 years ago

  • Status changed from Pending Review(レビュー待ち) to Fixed(完了)
  • % Done changed from 50 to 100

unitテストのテストケースを作成し、レプリケーション環境で動作させましたが、
エラーはありませんでした。masterブランチのコードとの差異も無し

$max_loop = 20; 
$t = new lime_test($max_loop * 4, new lime_output_color());
new sfDatabaseManager($configuration);
sfContext::createInstance($configuration);
for ($i = 0; $i < $max_loop; $i++)
{
  try 
  {
    $conn = opDoctrineQuery::getMasterConnection();
    $conn->beginInternalTransaction();
    $member_config = new MemberConfig();
    $member_config->name = $uniq1 = md5(uniqid(true));
    $member_config->value = $uniq2 = md5(uniqid(true));
    $member_config->name_value_hash = md5($uniq1.','.$uniq2);
    $member_config->member_id = $member_id = 1;
    $member_config->save($conn);
    $member_config2 = Doctrine_Core::getTable('MemberConfig')->find($member_config->id);

    $t->info(sprintf('Check Member Config Data %d time', $i + 1));
    $t->isa_ok($member_config, 'MemberConfig', 'check1 object');
    $t->is($member_config->name, $uniq1, 'check2 name');
    $t->is($member_config->value, $uniq2, 'check3 value');
    $t->is($member_config->name_value_hash, md5($uniq1.','.$uniq2), 'check4 name_value_hash');
    $conn->rollback();
  }
  catch (Exception $d) 
  {
    $conn->rollback();
  }
}


Also available in: Atom PDF