Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:一个PDO实例中断另一个PDO实例的事务_Php_Oracle_Pdo_Transactions - Fatal编程技术网

PHP:一个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

下面的代码可以工作,尽管在运行事务时我创建了另一个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();

// 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对象。