我正在使用PostgreSQL 9.3
我对交易及其工作方式有一个误解。假设我们在事务中包装了一些SQL运算符,如下所示:
BEGIN;
insert into tbl (name, val) VALUES('John', 'Doe');
insert into tbl (name, val) VALUES('John', 'Doee');
COMMIT;
如果出现问题,事务将自动回滚。考虑到这一点,我无法确定何时应该显式使用ROLLBACK?必要时可以举个例子吗?
在PostgreSQL中,事务不会因错误而自动回滚。
它设置为中止状态,在该状态下,其他命令将失败并显示错误,直到您回滚该事务。
观察:
regress=> BEGIN;
BEGIN
regress=> LOCK TABLE nosuchtable;
ERROR: relation "nosuchtable" does not exist
regress=> SELECT 1;
ERROR: current transaction is aborted, commands ignored until end of transaction block
regress=> ROLLBACK;
ROLLBACK
这很重要,因为它可以防止您意外执行一半事务。想象一下,如果PostgreSQL自动回滚,允许发生新的隐式事务,并且您尝试运行以下语句序列:
BEGIN;
INSERT INTO archive_table SELECT * FROM current_tabble;
DELETE FROM current_table;
COMMIT;
PostgreSQL看到错字时将中止事务current_tabble
。因此,DELETE
将永远不会发生-错误发生后,所有语句都将被忽略,并且将COMMIT
视为ROLLBACK
已中止的事务的:
regress=> BEGIN;
BEGIN
regress=> SELECT typo;
ERROR: column "typo" does not exist
regress=> COMMIT;
ROLLBACK
如果它自动将事务回滚,就好像您在运行:
BEGIN;
INSERT INTO archive_table SELECT * FROM current_tabble;
ROLLBACK; -- automatic
BEGIN; -- automatic
DELETE FROM current_table;
COMMIT; -- automatic
...不用说,这可能会让您很沮丧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句