Обработка транзакций PHP с несколькими объектами mysqli - PullRequest
0 голосов
/ 30 марта 2012

Допустим, у нас есть два отдельных класса, каждый из которых владеет объектом mysqli для использования в операциях с базой данных.

class A{
  protected $mysqliObject;
  public function __constructor(){
    $this->mysqliObject=new mysqli(...)
  }
  public function doSomething(){
    $this->mysqliObject->query(...);
  }
}
class B{
  protected $mysqliObject;
  public function __constructor(){
    $this->mysqliObject=new mysqli(...)
  }
  public function doSomething(){
    $this->mysqliObject->query(...);
  }
}

Методы doSomething() используют $mysqliObject длязапрос к базе данных (SELECT, UPDATE, DELETE и т. д.).Я хочу сделать следующее за пределами:

// Start point
$aObject=new A();
$bObject=new B();
$aObject->doSomething();
$bObject->doSomething();
// End point

... но я хочу откатить оба запроса в случае сбоя любого из них.Как я могу это сделать?

  • Могу ли я создать новый объект mysqli в «Начальной точке» и использовать его для фиксации или отката в «Конечной точке» запроса базы данных class Aи class B?
  • Нужно ли создавать снаружи и передавать те же $mysqliObject __constructor() из class A и class B и использовать их для отката или фиксации (снаружи).

Хотелось бы увидеть больше техник с проконами.

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Каждый имеющийся у вас объект подключения к базе данных представляет собой отдельное подключение к базе данных, даже если подключение к одному и тому же серверу базы данных.Каждое соединение полностью не зависит друг от друга, поэтому транзакция, запущенная в одном соединении, будет невидима для другого соединения.

Если все ваши базы данных имеют доступ к одному и тому же серверу, просто создайте одно соединение и передайте его любому, кому необходим доступ к соединению.Тогда транзакция будет распространяться на все приложения.

class ClassThatNeedsDbAccess
{
    protected $connection = NULL;

    protected function doQuery ($query)
    {
        return ($this -> connection -> execute ($query));
    }

    public function __construct (PDO $connection)
    {
        $this -> connection = $connection;
    }
}

class OtherClassThatNeedsDbAccess extends ClassThatNeedsDbAccess
{
}

$myDb = new PDO ('dsn_goes_here');

$obj1 = new ClassThatNeedsDbAccess ($myDb);
$obj2 = new OtherClassThatNeedsDbAccess ($myDb);

Если вы разговариваете с разными серверами баз данных, вам, вероятно, следует заключить все соединения в объект, который может координировать действия базы данных.Этот объект будет обязан следить за тем, какое соединение с базой данных имеет транзакцию в полете.

0 голосов
/ 30 марта 2012

Используйте один объект MySQL - соединение для всей вашей бизнес-логики ... взгляните на шаблон синглтона.Вы можете передать его конструктору или использовать метод статического класса для получения объекта mysql.

Тогда от вас зависит, где вы начнете завершать транзакцию, соединение должно быть таким же.Лучше всего абстрагировать его в некоторый общий уровень доступа к базе данных.

...