首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么我要在失败提交后回滚?

为什么我要在失败提交后回滚?
EN

Stack Overflow用户
提问于 2014-06-19 21:34:17
回答 2查看 2.9K关注 0票数 0

为什么我要在失败的rollback之后commit?万一commit失败,DB无论如何也不会得到更改。那我为什么要叫rollback这个案子呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-20 06:18:38

让我们以Oracle事务管理文档为例,它也适用于其他数据库引擎:

事务在提交或回滚时结束,显式地使用COMMIT或ROLLBACK语句,或者在发出DDL语句时隐式结束。

如果不指定提交/回滚,您可能会遇到以下情况:

  • 用户断开与Oracle数据库的连接。当前事务已提交。
  • 用户进程异常终止。当前事务将回滚。

数据库事务管理基于事务日志记录:

  1. 从旧到新的状态转换记录在重做日志中。
  2. 从新到旧的状态转换记录在撤消日志中。

由于事务隔离需求,数据会根据实际的表结构进行更改,并且是锁定机制阻止其他事务看到未提交的更改。实际数据被更改,因为当前事务需要在事务生存期内读取自己的写操作。

因此,实际的数据被更改了,但是由于我们有重做和撤消日志,我们可以很容易地提交/回滚,甚至回滚中的可疑分布事务,这些事务是针对给定数据源成功提交的,而全局事务由于其他已登记的数据源已经回滚而失败。

回滚包括撤消当前未提交事务记录的所有数据更改,因此,如果当前事务失败,则应使用ROOBACK。

票数 1
EN

Stack Overflow用户

发布于 2014-06-19 21:44:20

我认为只有两个原因可以解释提交失败的原因:

  1. dbms不可用或损坏。
  2. 延迟约束生效。

据我所知,T不支持延迟约束。即使是这样,它也应该在失败时执行隐式回滚。

至于不可用或损坏的dbms :如果提交不起作用,为什么要回滚?

结论:当提交失败时,我没有理由执行回滚。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24316603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档