PHP-соединение Oracle не откатывается - PullRequest
0 голосов
/ 31 августа 2018

Полагаю, я не совсем понимаю, как PHP передает объекты или как работает Oracle. Мой код состоит из 3 частей:

  1. Файл, который создает соединение с базой данных как глобальная переменная
  2. Классы, которые отправляют запросы и параметры в 3-ю часть. Все они требуют 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;

Разве оплата не будет отменена?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...