【发布时间】:2013-12-01 13:26:58
【问题描述】:
在我过时的程序代码(我现在想将其转换为 OOP)中,我有如下简单的数据库事务代码:
mysql_query("BEGIN");
mysql_query("INSERT INTO customers SET cid=$cid,cname='$cname'");
mysql_query("INSERT INTO departments SET did=$did,dname='$dname'");
mysql_query("COMMIT");
如果我构建 OOP 类 Customer 和 Department 来映射 customers 和 departments 数据库表,我可以插入表记录如下:
$customer=new Customer();
$customer->setId($cid);
$customer->setName($cname);
$customer->save();
$department=new Department();
$department->setId($did);
$department->setName($dname);
$department->save();
My Customer 和 Department 类在内部使用其他 DB 类来查询数据库。
但是如何使 $customer.save() 和 $department.save() 成为数据库事务的一部分?
我是否应该有一个外部类开始/结束事务,其中实例化了 Customer 和 Department 类,或者事务应该以某种方式在 Customer 中开始(如 Customer.startTransaction())并在 Department 中结束(如 Department.endTransaction())?或者……
【问题讨论】:
-
mysql_*函数不再维护,不应在任何新代码库中使用。它正在逐步淘汰,以支持更新的 API。相反,您应该将prepared statements 与PDO 或MySQLi 一起使用。 -
另一方面,你不应该在同一个类中拥有域逻辑和持久性逻辑。尝试实现data mapper 模式(不,它不是 ORM 的名称)。至于您需要在单个事务中存储多个条目的情况,此时您应该开始使用unit of work 来管理您的映射器。
-
感谢 tereško,我当然会使用 mysqli,但这里的主要问题是如何在一个类上启动数据库事务并将其提交到另一个类!?
-
您是否真正研究过工作单元是什么以及做什么?在 PoEAA 中有整整一章。
-
在 php 中的方法是用 -> 操作符调用的,而不是点 (.)
标签: php mysql oop transactions