psql交互模式下如何自动回滚一个事务?
How to automatically rollback a transaction in psql's interactive mode?
让我们假设文件 erroneous-query.sql
的以下内容:
BEGIN;
SELECT 1/0;
COMMIT;
当我在 psql 的交互模式下说 \i erroneous-query.sql
时,我得到这个:
BEGIN
psql:erroneous-query.sql:2: ERROR: division by zero
但我需要手动说 ROLLBACK;
- 否则,交易将挂起(并阻止其他一切)。
如何配置 psql 为我自动回滚此事务?我尝试了 \set ON_ERROR_ROLLBACK off
,但无济于事。
无法使 psql
自动发出 ROLLBACK
。
但是中止的事务(有错误且没有保存点的事务)将立即释放所有锁,因此它永远不会阻塞任何其他人。
事务中剩下的语句会很快完成,每一个都会引起[=13=]
ERROR: current transaction is aborted, commands ignored until end of transaction block
按照你的建议去做其实是很危险的:那样一个事务的一部分(错误后的语句)会在不同的事务中执行,整个事务的原子性就会丢失。
让我们假设文件 erroneous-query.sql
的以下内容:
BEGIN;
SELECT 1/0;
COMMIT;
当我在 psql 的交互模式下说 \i erroneous-query.sql
时,我得到这个:
BEGIN
psql:erroneous-query.sql:2: ERROR: division by zero
但我需要手动说 ROLLBACK;
- 否则,交易将挂起(并阻止其他一切)。
如何配置 psql 为我自动回滚此事务?我尝试了 \set ON_ERROR_ROLLBACK off
,但无济于事。
无法使 psql
自动发出 ROLLBACK
。
但是中止的事务(有错误且没有保存点的事务)将立即释放所有锁,因此它永远不会阻塞任何其他人。
事务中剩下的语句会很快完成,每一个都会引起[=13=]
ERROR: current transaction is aborted, commands ignored until end of transaction block
按照你的建议去做其实是很危险的:那样一个事务的一部分(错误后的语句)会在不同的事务中执行,整个事务的原子性就会丢失。