0

我刚刚成功尝试使用 beginTransaction() 在我的项目中使用 PHP 执行我的 sql 语句。我有一系列项目需要写入数据库,并且每个项目都必须在存储之前针对某些内容进行验证。关闭数据库的自动提交行为的好处之一是,如果中间出现问题,您可以回滚整个事务。在我的项目中,如果一项无效,整个数组不应该记录在数据库中,这就是我选择使用这种方法的原因。

现在我只是想知道这在性能方面是否真的是更好的方法?因为即使验证了数组中的最后一项,我仍然需要手动 commit() 之前的执行。提交是否重复执行sql?

我现在能想到的唯一优点是,如果您想验证所有项目(假设所有项目都是有效的)然后编写每个项目,您只需要执行一个循环而不是两个循环。

4

3 回答 3

2

首先验证一切,然后开始一个事务,数据库交互。不进行交易以帮助验证数据。

于 2012-05-05T09:50:19.043 回答
0

您可以使用保存点。从手册

BEGIN;
     INSERT INTO table1 VALUES (1);
     SAVEPOINT my_savepoint;
       INSERT INTO table1 VALUES (2);
     ROLLBACK TO SAVEPOINT my_savepoint;
     INSERT INTO table1 VALUES (3); 
COMMIT;

您仍然需要验证您的输入,但您现在可以在单个事务中回滚。使用事务可以使数据库更快,因为有更少的(隐式)提交。

于 2012-05-05T10:07:46.330 回答
0

Commit 不会重复 SQL 执行。

通常,在事务中工作时,无论何时执行 INSERT/UPDATE/DELETE 语句,数据库都会将记录/数据页的副本复制到事务日志中,然后执行实际的记录更改。

如果其他人在您的交易过程中试图访问这些记录/数据页面,他们将被重定向到交易日志中的副本。

然后,当你执行提交时,数据库本身的数据已经更新了,服务器需要做的就是删除事务日志。

如果您回滚而不是提交,那么数据库服务器将通过事务日志回溯,将您更新的所有记录/数据页面恢复到其原始状态,并删除每个事务日志条目。

因此,回滚是一种开销,因为数据库服务器必须将数据恢复到其事务前状态。

于 2012-05-05T10:08:23.590 回答