【发布时间】: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 方法可以启动事务、查询、提交或回滚。它可以工作,但我的问题实际上是关于设计的 - 这太多太多了吗?
我的伪代码存在缺陷——它没有考虑到数据库的读取和写入,所以应该有query、update、insert、delete等方法。
从 OO 设计的角度来看,这是否有意义?从编码的角度来看,这看起来不错——您可以在普通代码的 try/catch 之外编写语句,然后再执行。在这方面似乎也有点烦人......
【问题讨论】:
-
队列没有多大意义。 PHP 没有线程,并且 db 调用将阻塞,直到 db 操作完成。由于您必须等到前一个操作完成后才能开始新的操作,所以没有必要排队。
-
我不太担心这里的线程和阻塞 - 更重要的是代码和可用性/可重用性。
-
当事务是顺序依赖时,排队没有多大意义。例如插入一行,然后新行的插入 id 生成下一个序列。您可能会发现,您遇到的大多数查询序列都是这种类型的,并且仅仅将查询填充到队列中没有多大意义,即使它不是出于线程目的。
-
这更有意义 - 我没有考虑获取插入 ID。好主意,谢谢!
标签: php mysql oop transactions