【问题标题】:MySQL transactions with PHP - queue statements?使用 PHP 的 MySQL 事务 - 队列语句?
【发布时间】:2016-10-10 12:32:19
【问题描述】:

这个想法刚刚出现在我身上,我不知道它是不是疯了。我在网上找到的任何示例都没有以这种方式设置。我正在围绕 MySQLi(或者可能是 PDO)构建一个包装器,而我正处于设计阶段。这是一个个人项目,可以更多地了解 OO 设计,所以虽然我很欣赏使用 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 方法可以启动事务、查询、提交或回滚。它可以工作,但我的问题实际上是关于设计的 - 这太多太多了吗?

我的伪代码存在缺陷——它没有考虑到数据库的读取和写入,所以应该有queryupdateinsertdelete等方法。

从 OO 设计的角度来看,这是否有意义?从编码的角度来看,这看起来不错——您可以在普通代码的 try/catch 之外编写语句,然后再执行。在这方面似乎也有点烦人......

【问题讨论】:

  • 队列没有多大意义。 PHP 没有线程,并且 db 调用将阻塞,直到 db 操作完成。由于您必须等到前一个操作完成后才能开始新的操作,所以没有必要排队。
  • 我不太担心这里的线程和阻塞 - 更重要的是代码和可用性/可重用性。
  • 当事务是顺序依赖时,排队没有多大意义。例如插入一行,然后新行的插入 id 生成下一个序列。您可能会发现,您遇到的大多数查询序列都是这种类型的,并且仅仅将查询填充到队列中没有多大意义,即使它不是出于线程目的。
  • 这更有意义 - 我没有考虑获取插入 ID。好主意,谢谢!

标签: php mysql oop transactions


【解决方案1】:

从 OO 设计的角度来看是否有意义?有点。从数据库使用的角度来看,这有意义吗?绝对不是。

正如 Marc B 在评论中指出的那样,数据库已经将操作排队,因为它们正在阻塞调用*。它们将按此顺序发生。随它去吧。

*:虽然你可以进行非阻塞调用,但通常情况并非如此。

【讨论】:

  • 正如我对 Marc 的回应,我不一定关心应用程序性能 - 尽管我当然不打算大幅降低性能。更多的是代码本身以及程序员如何使用它。如果它不会对性能产生影响,那么从使用的角度来看是否有意义?
猜你喜欢
  • 2016-11-13
  • 2013-05-15
  • 2023-03-18
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多