Php 回滚是否提高了性能?

Php 回滚是否提高了性能?,php,sql,postgresql,database-performance,Php,Sql,Postgresql,Database Performance,我刚刚成功地尝试使用beginTransaction()在使用PHP的项目中执行sql语句。我有一个需要写入数据库的项目数组,每个项目在存储之前都必须进行验证。关闭数据库的自动提交行为的一个好处是,如果中间出现了错误,可以回滚整个事务。在我的项目中,如果一项无效,则整个数组不应记录在数据库中,这就是我选择使用这种方法的原因 现在我只是想知道这是否真的是一个更好的性能方面的方式?因为即使验证了数组中的最后一项,我仍然需要手动提交()上一次执行。commit是否重复sql执行 我现在能想到的唯一优点

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

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


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

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

您可以使用保存点。从:


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

提交不会重复SQL执行

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

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

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

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


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

SQL不是数据库产品。它只是许多RDBMS使用的一种语言。您使用的是什么数据库系统以及什么版本?略为OT:如果可以通过查看数据库状态和更改本身来确定更改的有效性,那么最好在触发器之前将验证置于
,因此,无论使用哪种应用程序代码的客户端,都会应用业务逻辑。正如我所说的,如果我首先验证所有内容,假设所有内容都正常,我必须再次循环数组以将每个项目写入数据库。这通常是个坏主意。仅仅因为在事务开始之前的某个时间某个东西是真的,并不能证明在应用事务时它仍然是真的,除非在数据库本身之外有一些同步。事务正是一种机制,通过它,您可以在面对并发修改时确保数据库的完整性。+1-除非您要走得更远,并且您的事务需要很长时间,并且/或者在其过程中锁定了许多表,并且开始阻止比所需更多的并发操作。然后你应该把它分成更小的事务(以一种聪明的方式);因此,这个建议完全适得其反。这种对回滚实现的描述不适用于PostgreSQL。使用PG,更新前的记录不会被复制到任何地方,而是保留在原地。系统在任何时间点都知道一行是否为当前行及其事务ID。开销主要是在将来的某个时候,VACUUM必须运行以回收这些未使用版本的行所使用的磁盘空间,但提交和回滚都是如此。因此Daniel所说的意思是,在PostgreSQL上回滚速度非常快。
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;