rollBack是否提高了性能?

时间:2012-05-05 09:42:51

标签: php sql postgresql database-performance

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

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

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

3 个答案:

答案 0 :(得分:2)

首先验证所有内容,然后开始事务,数据库交互。不进行交易以帮助验证数据。

答案 1 :(得分:0)

您可以使用保存点。来自manual

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;

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

答案 2 :(得分:0)

Commit不会重复执行SQL。

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

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

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

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

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