回滚是否提高了性能


Does rollBack improve performance?

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

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

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

首先验证所有内容,然后开始事务,数据库交互。事务不是为了帮助验证数据。

提交不会重复 SQL 执行。

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

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

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

如果回滚而不是落实,则数据库服务器将回溯事务日志,将已更新的所有记录/数据页恢复到其原始状态,并删除每个事务日志条目。

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

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

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;

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