如何在Doctrine中使用不同的连接?

时间:2010-09-30 14:25:24

标签: transactions doctrine connection

我试图在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 :(得分:0)

我认为这是Doctrine中的一个错误(据我所知,仍然存在于当前的1.2版本中)。当您从Doctrine_Connection :: createQuery()创建查询时,它不会将自身作为第一个参数传递给查询,因此它始终在默认连接上创建。

错误修复应该是一个简单的错误,将$ this传递给Doctrine_Connection中的Doctrine_Query :: create()。

解决方法是自己创建查询,并传入连接:

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