rollback
失败后为什么commit
?如果commit
失败,则无论如何数据库都无法获得更改。那么我为什么要在这种情况下致电rollback
?
答案 0 :(得分:1)
我可以想到为什么COMMIT会失败的原因只有两个:
据我所知,T-SQL不支持延迟约束。即使它确实如此,它也应该在失败时执行隐式ROLLBACK。
关于dbms不可用或已损坏:嗯,如果COMMIT不起作用,为什么要ROLLBACK?
结论:当COMMIT失败时,我认为没有理由执行ROLLBACK。
答案 1 :(得分:1)
让Oracle transaction management documentation同样适用于其他数据库引擎:
事务在提交或回滚时结束 显式地使用COMMIT或ROLLBACK语句或隐式地使用 发布DDL声明。
如果不指定COMMIT / ROLLBACK,您可能会遇到以下情况:
用户断开与Oracle数据库的连接。当前交易已提交。
用户进程异常终止。当前交易将被回滚。
数据库事务管理基于事务日志记录:
由于事务隔离要求,数据会根据实际的表结构进行更改,而且它的锁定机制会阻止其他事务查看未提交的更改。实际数据已更改,因为当前事务需要在事务生命周期内读取自己的写入。
因此实际数据已更改,但由于我们同时拥有重做和撤消日志,因此我们可以轻松提交/回滚甚至回滚已针对给定数据源成功提交的不确定分布式事务,同时全局事务失败,因为其他已登记的数据源已回滚。
回滚包括撤消当前未提交的事务记录的所有数据更改,因此如果当前事务失败,您应该ROOBACK。