我试图在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总是使用当前连接来执行查询。”
如何使用不同的连接和单一交易?
答案 0 :(得分:0)
我认为这是Doctrine中的一个错误(据我所知,仍然存在于当前的1.2版本中)。当您从Doctrine_Connection :: createQuery()创建查询时,它不会将自身作为第一个参数传递给查询,因此它始终在默认连接上创建。
错误修复应该是一个简单的错误,将$ this传递给Doctrine_Connection中的Doctrine_Query :: create()。
解决方法是自己创建查询,并传入连接:
$query1 = Doctrine_Query::create($cnx1);
$query2 = Doctrine_Query::create($cnx2);