PHP:一个PDO实例中断另一个PDO实例的事务
下面的代码可以工作,尽管在运行事务时我创建了另一个PDO对象,但这不会干扰我的事务:PHP:一个PDO实例中断另一个PDO实例的事务,php,oracle,pdo,transactions,Php,Oracle,Pdo,Transactions,下面的代码可以工作,尽管在运行事务时我创建了另一个PDO对象,但这不会干扰我的事务: $dsn = 'mysql:host=' . "localhost" . ';dbname=' . "somedb"; $options = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::N
$dsn = 'mysql:host=' . "localhost" . ';dbname=' . "somedb";
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
);
// first PDO object
$db = new \PDO($dsn, "someuser", "somepass", $options);
$db->beginTransaction();
$stmt = $db->prepare("INSERT INTO vbclient set company = 'test'");
$stmt->execute();
// second PDO object
$dbnew = new \PDO($dsn, "someuser", "somepass", $options);
$newstmt = $dbnew->prepare('select * from vbclient where clientID = 1');
$newstmt->execute();
$stmt = $db->prepare("INSERT INTO vbclient set company = 'test2'");
$stmt->execute();
$db->commit();
但如果我将第二个PDO对象的创建放在一个单独的函数中,它似乎会终止第一个PDO对象的事务:
$dsn = 'mysql:host=' . "localhost" . ';dbname=' . "somedb";
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
);
// first PDO object
$db = new \PDO($dsn, "someuser", "somepass", $options);
$db->beginTransaction();
$stmt = $db->prepare("INSERT INTO vbclient set company = 'test'");
$stmt->execute();
secondPDO();
$stmt = $db->prepare("INSERT INTO vbclient set company = 'test2'");
$stmt->execute();
$db->commit();
function secondPDO() {
$dsn = 'mysql:host=' . "localhost" . ';dbname=' . "somedb";
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
);
// second PDO object
$dbnew = new \PDO($dsn, "someuser", "somepass", $options);
$newstmt = $dbnew->prepare('select * from vbclient where clientID = 1');
$newstmt->execute();
}
我得到错误“没有活动事务”。我知道如果我用另一个实例覆盖PDO句柄,通常会发生这种情况。但是我没有这样做,只有当第二个PDO对象在另一个函数中时才会发生错误
你知道为什么吗?
谢谢。为什么选择2个PDO对象?因为我使用第三方类来启动它们自己的PDO对象。