Как это сделать, чтобы использовать разные соединения в Doctrine? - PullRequest
1 голос
/ 30 сентября 2010

Я пытался использовать несколько транзакций в Doctrine (v1.2.2).Вот мой тест:

// Open a new database connection
$cnx1 = Doctrine_Manager::connection('mydsn'); // $cnx1 will be named '0'

// Open a second database connection
$cnx2 = Doctrine_Manager::connection('mydsn'); // $cnx2 will be named '1'

// Start a transaction on connection #1
$cnx1->beginTransaction();
// Update the name of user #1
$query1 = $cnx1->createQuery();
$query1->update('SfGuardUser')->set("username", "'Name 1'")->where("id='1'");
$query1->execute();

// Start an other transaction on connection #2
$cnx2->beginTransaction();
// Update the name of user #2
$query2 = $cnx2->createQuery();
$query2->update('SfGuardUser')->set("username", "'Name 2'")->where("id='2'");
$query2->execute();

// Commit transaction #2
$cnx2->commit();

(Уровень изоляции по умолчанию - REPEATABLE READ.)

После выполнения кода оба имени пользователя изменились в базе данных.По моему мнению, следует изменить только имя пользователя # 2, поскольку транзакция # 1 еще не была зафиксирована.

При отладке я обнаружил, что это всегда соединение № 2 (последнее открытое)который используется для всех запросов.Зачем ?

В документации Doctrine мы можем прочитать «С самого начала Doctrine была разработана для работы с несколькими соединениями. Если отдельно не указано, Doctrine всегда использует текущее соединение для выполнения запросов».сделать, чтобы использовать разные соединения и уникальные транзакции?

1 Ответ

0 голосов
/ 08 июня 2011

Я полагаю, что это ошибка в Doctrine (насколько я могу судить, она все еще присутствует в текущей версии 1.2). Когда вы создаете запрос из Doctrine_Connection :: createQuery (), он не передается самому запросу в качестве первого параметра, поэтому он всегда создается при подключении по умолчанию.

Исправление должно быть простым, передавая $ this в Doctrine_Query :: create () в Doctrine_Connection.

Обходной путь - создать запрос самостоятельно и передать соединение:

$query1 = Doctrine_Query::create($cnx1);
$query2 = Doctrine_Query::create($cnx2);
...