PHP使用try-catch进行多个数据库查询

时间:2012-05-31 14:02:47

标签: php codeigniter

我正在尝试实现处理数据库错误的最佳方法。我正在使用mvc框架(codeigniter)。当我去创建我的对象时,我最终会对不同的表进行多次查询。

我遇到的问题是如果第一个查询成功,第二个查询失败,我收到错误。但是,第一个查询仍然成功,数据已经在该表中。

我想要做的是将所有查询包装在try块中,这样,如果任何查询失败,将不会完成任何查询。

通过回滚更改,是否有更好的方法来处理这种情况(可能是特定于codeigniter)?

3 个答案:

答案 0 :(得分:4)

try块不能直接执行....

您需要支持事务的表,即InnoDB表

首先,您需要将数据库表的数据库引擎更改为InnoDB(如果它们仍然是MyISAM)。

在数据库操作之前,您需要启动一个事务(在线检查适合您的方法)。我使用PDO所以我通常会这样做:

$pdoObject->startTransaction();

因此,从查询的返回值开始,如果成功则继续下一个查询,否则您将执行rollback()并结束执行。在这一点上你的try ... catch可能很有用,因为你可以决定在查询执行失败的情况下抛出异常。你抓住它并做rollback()

如果一切顺利,您需要执行commit()其他更改将不会反映

注意:只有InnoDB表支持MySQL中的事务

答案 1 :(得分:1)

您要找的是transactions

您必须确保所有表都使用InnoDB。

答案 2 :(得分:0)

if ($this->db->trans_status() !== false) {
    // do stuff
}

我用来验证交易。请注意,您还可以为测试模式发送布尔值:

$this->db->trans_start(true);