MySQL транзакции с PHP - операторы очереди? - PullRequest
0 голосов
/ 12 октября 2011

Эта мысль пришла мне в голову, и я понятия не имею, сумасшедшая она или нет.Никакие примеры, которые я нашел в Интернете, не созданы таким образом.Я создаю оболочку вокруг MySQLi (или, может быть, PDO), и я только на стадии разработки.Это для личного проекта, чтобы узнать больше о дизайне ОО, так что, хотя я ценю мысли об использовании Doctrine или Propel или что-то еще, нет, спасибо.Этот вопрос должен помочь мне узнать некоторые лучшие принципы дизайна;Я знаю, что код будет работать, но с точки зрения дизайна, я работаю безумно?

Это будет мой первый опыт работы с транзакциями в PHP с MySQL.Я понимаю основы - используйте оператор try / catch, коммит в конце, откат, если есть исключение.Но посередине приведен список операторов для выполнения:

(псевдокод)

try
{
  $db->startTransaction();
  $db->query('...');
  $db->query('...');
  $db->query('...');
  $db->commit();
} catch (Exception $exc)
{
  $db->rollback();
}

Что если метод query добавляет запросы во внутренний массив?Затем метод commit выполняет этот тип try / catch внутри и выбрасывает другое исключение.Вот так (опять же, псевдокод):

$db = new AwesomeDBWrapper('...');
$db->query('...');
$db->query('...');

try
{
  $db->commit();
} catch (AwesomeDBWrapperCommitException $exc)
{
  echo $exc;
}

Метод commit может запустить транзакцию, запрос, фиксацию или откат.Это может сработать, но мой вопрос действительно о дизайне - это слишком много?

В моем псевдокоде есть подводные камни - он не учитывает чтение противзапись в базу данных, так что в действительности должны быть методы query, update, insert, delete и т. д.

Имеет ли это какой-то смысл с точки зрения проектирования ОО?Это кажется хорошим с точки зрения кодирования - вы можете написать свои выражения вне try / catch в обычном коде, а затем выполнить позже.Это тоже немного раздражает ...

1 Ответ

0 голосов
/ 12 октября 2011

Имеет ли это смысл с точки зрения дизайна ОО? Своего рода. Имеет ли это смысл с точки зрения использования базы данных? Определенно нет.

Как отметил Марк Б в комментарии, база данных все равно ставит операции в очередь, поскольку они блокируют вызовы *. Они будут происходить в таком порядке. Просто позволь ему сделать свое дело.

*: хотя вы МОЖЕТЕ делать неблокирующие вызовы, обычно это не так.

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