我刚刚成功尝试使用beginTransaction()在我的项目中使用PHP执行我的sql语句。我需要将一系列项目写入数据库,并且每个项目必须在存储之前针对某些内容进行验证。关闭数据库的自动提交行为的一个好处是,如果中间出现问题,您可以回滚整个事务。在我的项目中,如果一个项目无效,整个数组不应该记录在数据库中,这就是我选择使用这种方法的原因。
现在我只是想知道这在性能方面是否真的更好?因为即使验证了数组中的最后一项,我仍然需要手动提交()上一次执行。 commit是否重复执行sql?
我现在能想到的唯一优势是,如果你想要全部验证它们(假设所有项都有效),你只需要做一个循环而不是两个循环,然后写下每个循环。
答案 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语句时,数据库都会将记录/数据页的副本带到事务日志中,然后执行实际的记录更改。
如果有人在交易过程中尝试访问这些记录/数据页面,他们将被重定向到事务日志中的副本。
然后,当您执行提交时,数据库本身的数据已经更新,而服务器需要做的就是删除事务日志。
如果您回滚而不是提交,则数据库服务器会回溯事务日志,将您已更新的所有记录/数据页还原到其原始状态,并删除每个事务日志条目。
因此,回滚是一种开销,因为数据库服务器必须将数据恢复到事务前的状态。