为什么数据库 DDL 不支持事务回滚

一般数据库的实现,以Oracle为例,在执行DDL后会隐式提交。所以你看上去好像DDL不会回滚。其实你可以做个实验,在同一个事务里执行几条DML,再执行DDL,再回滚。
一般数据库的实现,以Oracle为例,在执行DDL后会隐式提交。所以你看上去好像DDL不会回滚。其实你可以做个实验,在同一个事务里执行几条DML,再执行DDL,再回滚。你会发现DDL之前执行的DML也不会回滚,因为数据库已经帮你提交了。
当然你会问为什么这么实现,这是因为内存空间有限,DDL是修改数据字典,而且通常不会有长时间的DDL执行。数据库自动提交有助于控制数据字典的内存占用,把更多的空间留给DML。
Oracle为了实现DDL可以回滚的功能,且实现多版本读一致性,那么就必须在DDL发生后,将修改的表锁定,避免其他会话的访问造成不一致这会导致Oracle中出现锁升级的情况,并且严重的影响Oracle的并发性,而且会大大增加死锁产生的几率要知道,Oracle的锁机制和多版本读一致性使得Oracle的并发性在所有数据库产品中首屈一指。
显然为了实现DDL的回滚而损失最值得称道的并发性,Oracle认为得不偿失。
延伸阅读:
SQL TRUNCATE TABLE 语句用来删除表中的所有记录,也即清空表,它类似于不带 WHERE 子句的 DELETE FROM 语句。
TRUNCATE TABLE 和 DROP TABLE
DROP TABLE 用来删除表,包括删除该表的数据、结构、索引、触发器、约束等所有信息。一旦使用 DROP TABLE 删除了表,则该表的所有信息都将丢失,该表再也无法使用了。如果您希望存储一些数据,就只能重新创建该表。
TRUNCATE TABLE 仅仅删除表的所有记录,表的结构、索引、触发器、约束等将被保留,后续仍然可以使用该表。
TRUNCATE TABLE 和 DELETE FROM
不带 WHERE 子句的 DELETE FROM 语句同样可以达到清空表的效果,但是 TRUNCATE TABLE 使用的系统资源和日志资源更少,因此比 DELETE FROM 更加快速。
DELETE FROM 语句每删除一行,都会在事务日志中为所删除的行记录一项。TRUNCATE TABLE 通过释放表中数据所用的数据页来删除数据,只会在事务日志中记录页的释放。
此外,TRUNCATE TABLE 还能重置具有自动递增(AUTO_INCREMENT)属性的字段,而 DELETE FROM 却不具备该功能。
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系邮箱:hopper@cornerstone365.cn 处理,核实后本网站将在24小时内删除。
相关文章推荐
低代码开发是一种创新的应用开发模式,它通过可视化界面、预置组件和拖拽式操作,让用户无需编写大量代码即可快速构建应用。
织信低代码作为国内主流的企业级低代码开发平台之一,为企业提供高效、便捷的应用开发解决方案。
· 数据引擎:支持多达9个大类、37种字段组件,拖拽即可生成对应表单,满足企业多样化的数据管理需求。
· 流程引擎:采用可视化拖拽+连线操作,遵循BPMN2.0规范,支持多种流程模式,帮助企业实现业务流程的自动化管理。
· 权限引擎:提供团队、应用、数据三级权限管控,保障数据安全与业务合规。
· 自动化蓝图:支持可视化搭建业务流程。
· JavaScript脚本:支持前端业务逻辑开发。
· Java扩展包:支持后端复杂业务逻辑开发。
· 自定义API:支持与第三方系统集成。
织信低代码平台提供丰富的组件和模板,用户可以根据企业需求灵活配置应用,快速构建符合企业业务需求的应用系统。同时,织信低代码平台支持与第三方系统集成,实现数据的共享和业务的协同,打破数据孤岛,提升企业运营效率。
各行业用户的共同选择







