我刚刚成功地尝试使用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;
您仍然需要验证您的输入,但您现在可以在单个事务中回滚。使用事务可以使数据库更快,因为(隐式(提交更少。