我正在尝试实现处理数据库错误的最佳方法。 我正在使用 mvc 框架(代码点火器)。 当我去创建我的对象时,我最终会对不同的表进行多个查询。
我遇到的问题是,如果第一个查询成功,第二个查询失败,则会出现错误。 但是,第一个查询仍然成功,并且数据已在该表中。
我想做的是将所有查询包装在一个 try 块中,这样,如果其中任何一个失败,则不会完成任何查询。
有没有更好的方法来通过回滚更改来处理这种情况(也许是特定于代码点火器)?
try 块不会直接执行此操作。
您需要支持事务的表,即InnoDB表
首先,您需要将数据库表的数据库引擎更改为InnoDB(如果它们是MyISAM)。
在数据库操作之前,您需要开始事务(在线检查适合您的方法)。我使用 PDO,所以我通常会这样做:
$pdoObject->startTransaction();
因此,从查询的返回值来看,如果成功,则继续执行下一个查询,否则将执行rollback()
并结束执行。在这一点上,您的尝试...catch 可能很有用,因为您可以决定在查询执行失败时引发异常。你抓住它并做一个rollback()
如果一切成功,您需要执行commit()
否则更改将不会反映
注意:只有InnoDB表支持MySQL中的事务
您要查找的内容称为事务。
不过,您必须确保所有表都使用InnoDB。
if ($this->db->trans_status() !== false) {
// do stuff
}
是我用来验证交易的。请注意,您还可以为测试模式发送布尔值:
$this->db->trans_start(true);