首页 > 解决方案 > PHP oracle连接不回滚

问题描述

我想我对 PHP 如何传递对象或 oracle 如何工作感到困惑。我的代码有 3 个部分:

  1. 将数据库连接创建为全局变量的文件
  2. 向第三部分发送查询和参数的类。所有这些 require_once() 都是第一个文件,因此它们都应该使用相同的连接。
  3. 绑定参数并执行查询的抽象类。当构造(2)中的类时,它们将 db 连接从 require_once() 传递给此抽象类以供使用。

抽象类也有提交和回滚的功能。我希望当我从 (2) 回滚一个类时,所有这些类都会回滚,因为它们都使用相同的全局数据库连接。但他们没有。

我不明白什么?

数据库连接文件:

<?php
$db = ocilogon(...);

抽象数据库类

abstract class Database {
    private $conn;

    function __construct($conn) {
        $this->conn = $conn;
    }

    protected function query($query, array $params = []) {
        $stid = oci_parse($this->conn, $query);

        foreach($vars as $var => &$val) {
            oci_bind_by_name($stid, $var, $val);
        }

        $success = oci_execute($stid, OCI_NO_AUTO_COMMIT);

        return $success ? $stid : false;
    }

    public function commit() {
        return oci_commit($this->conn);
    }

    public function rollback() {
        return oci_rollback($this->conn);
    }
}

一个数据库类

require_once(connection_file.php);
require_once(Database.php);

class User extends Database {
    function __construct() {
        parent::__construct($GLOBALS['db']);
    }

    public function get($id) {
        $query = 'SELECT * FROM users where id = :id';

        $stid = $this->query($query, [':id' => $id]);

        return oci_fetch_assoc($stid);
    }
}

示例脚本

require_once(db_user.php);
require_once(db_payment.php);

$user = new User();
$payment = new Payment(); //Another class like User

$user->insert(...);
$payment->insert(...);

//Oops

$user->rollback();

exit;

付款不会也被回滚吗?

标签: phpdatabaseoraclecommitrollback

解决方案


推荐阅读