2

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

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

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

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

4

3 回答 3

4

try 块不会直接执行此操作....

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

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

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

$pdoObject->startTransaction();

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

如果全部成功,您需要执行commit()else 更改将不会被反映

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

于 2012-05-31T14:20:47.623 回答
1

您要查找的内容称为transactions

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

于 2012-05-31T14:16:22.813 回答
0
if ($this->db->trans_status() !== false) {
    // do stuff
}

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

$this->db->trans_start(true);
于 2012-06-01T11:00:35.577 回答