我想在 Postgres 数据库上的原子事务中运行大量语句。BEGIN;
放在脚本的开头和COMMIT;
结尾是否足够?我想确保如果在事务期间发生错误,它会自动回滚。
例如,我有脚本 test.sql:
BEGIN;
SELECT
*
FROM
intentional_error;
CREATE TABLE faketable (fakecolumn TIMESTAMP);
COMMIT;
intentional_error
不是我的架构中的真实表,因此我预计事务中的第一个语句会出错。当它出错时,我想知道是否faketable
会被创建。
根据我的研究,我找不到明确说明 aROLLBACK;
在这种情况下是自动的 Postgres 文档。有一个Stack Exchange 答案指出这ROLLBACK;
是自动的,但我很想看到 Postgres 文档中的测试或其他内容。
我在 Postgres 数据库(版本 12.44)上测试了这个问题。我创建了文件 test.sql (与问题中相同):
这是 CLI 的输出。
然后我仔细检查该表是否未创建。
总之,在其中一个语句出现错误的情况下,将其放在
BEGIN;
脚本的开头和COMMIT;
结尾就足以进行事务处理。ROLLBACK;