为什么要在sql中明确使用回滚?

圣安东尼奥

我正在使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们要在 useIsMounted 钩子中使用回调来从钩子中返回 ref?

来自分类Dev

为什么需要在mysql(InnoDB)中回滚SELECT?

来自分类Dev

如何在 SQL 中使用回滚命令

来自分类Dev

为什么SQL事务无法回滚

来自分类Dev

为什么不使用回调函数?

来自分类Javascript

为什么要在javascript中的每个函数之后使用分号?

来自分类Dev

为什么要在OSGi中创建和使用服务

来自分类Dev

Typescript-为什么我不能使用回调中的键来引用对象

来自分类Dev

当您可以在 Javascript 中全局调用函数时,为什么要使用回调?

来自分类Dev

当我没有执行回滚时,为什么会收到“当 AutoCommit 模式设置为“真”时无法调用回滚操作。”?

来自分类Dev

为什么在Python 3.7中明确使用变量时未使用变量

来自分类Dev

为什么要在函数的参数中赋值?

来自分类Python

为什么要在Python中关闭文件?

来自分类Dev

为什么要在init()中检查nil

来自分类Dev

为什么要在RabbitMQ中声明交换?

来自分类Dev

为什么需要在结构中填充?

来自分类Dev

从数据仓库创建报表时,为什么需要在SQL上使用T-SQL?

来自分类Dev

为什么要在AngularJS中使用$ onInit?

来自分类Dev

为什么要在golang中使用组合?

来自分类Dev

为什么要在 Angular 中使用 ValueAccessor?

来自分类Java

为什么要在Android中使用RequestQueue?

来自分类Dev

为什么要在Dialogflow中使用动作

来自分类Dev

为什么要在结构中使用malloc?

来自分类Java

为什么要在堆栈上使用Deque?

来自分类Dev

为什么要在FRP中使用行为

来自分类Dev

为什么要在延迟中使用setTimeout

来自分类Dev

为什么要在pbuilder上使用sbuild?

来自分类Dev

为什么要在memset上使用bzero?

来自分类Dev

为什么要在laravel中使用npm?

Related 相关文章

  1. 1

    为什么我们要在 useIsMounted 钩子中使用回调来从钩子中返回 ref?

  2. 2

    为什么需要在mysql(InnoDB)中回滚SELECT?

  3. 3

    如何在 SQL 中使用回滚命令

  4. 4

    为什么SQL事务无法回滚

  5. 5

    为什么不使用回调函数?

  6. 6

    为什么要在javascript中的每个函数之后使用分号?

  7. 7

    为什么要在OSGi中创建和使用服务

  8. 8

    Typescript-为什么我不能使用回调中的键来引用对象

  9. 9

    当您可以在 Javascript 中全局调用函数时,为什么要使用回调?

  10. 10

    当我没有执行回滚时,为什么会收到“当 AutoCommit 模式设置为“真”时无法调用回滚操作。”?

  11. 11

    为什么在Python 3.7中明确使用变量时未使用变量

  12. 12

    为什么要在函数的参数中赋值?

  13. 13

    为什么要在Python中关闭文件?

  14. 14

    为什么要在init()中检查nil

  15. 15

    为什么要在RabbitMQ中声明交换?

  16. 16

    为什么需要在结构中填充?

  17. 17

    从数据仓库创建报表时,为什么需要在SQL上使用T-SQL?

  18. 18

    为什么要在AngularJS中使用$ onInit?

  19. 19

    为什么要在golang中使用组合?

  20. 20

    为什么要在 Angular 中使用 ValueAccessor?

  21. 21

    为什么要在Android中使用RequestQueue?

  22. 22

    为什么要在Dialogflow中使用动作

  23. 23

    为什么要在结构中使用malloc?

  24. 24

    为什么要在堆栈上使用Deque?

  25. 25

    为什么要在FRP中使用行为

  26. 26

    为什么要在延迟中使用setTimeout

  27. 27

    为什么要在pbuilder上使用sbuild?

  28. 28

    为什么要在memset上使用bzero?

  29. 29

    为什么要在laravel中使用npm?

热门标签

归档