为什么我应该在提交失败后回滚

时间:2014-06-19 21:34:18

标签: java database hibernate jpa transactions

rollback失败后为什么commit?如果commit失败,则无论如何数据库都无法获得更改。那么我为什么要在这种情况下致电rollback

2 个答案:

答案 0 :(得分:1)

我可以想到为什么COMMIT会失败的原因只有两个:

  1. dbms不可用或已损坏。
  2. 延迟约束生效。
  3. 据我所知,T-SQL不支持延迟约束。即使它确实如此,它也应该在失败时执行隐式ROLLBACK。

    关于dbms不可用或已损坏:嗯,如果COMMIT不起作用,为什么要ROLLBACK?

    结论:当COMMIT失败时,我认为没有理由执行ROLLBACK。

答案 1 :(得分:1)

Oracle transaction management documentation同样适用于其他数据库引擎:

  

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

如果不指定COMMIT / ROLLBACK,您可能会遇到以下情况:

  
      
  • 用户断开与Oracle数据库的连接。当前交易已提交。

  •   
  • 用户进程异常终止。当前交易将被回滚。

  •   

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

  1. 从旧到新的状态转换记录在重做日志中。
  2. 从新到旧的状态转换记录在撤消日志中。
  3. 由于事务隔离要求,数据会根据实际的表结构进行更改,而且它的锁定机制会阻止其他事务查看未提交的更改。实际数据已更改,因为当前事务需要在事务生命周期内读取自己的写入。

    因此实际数据已更改,但由于我们同时拥有重做和撤消日志,因此我们可以轻松提交/回滚甚至回滚已针对给定数据源成功提交的不确定分布式事务,同时全局事务失败,因为其他已登记的数据源已回滚。

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