千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 为什么数据库 DDL 不支持事务回滚?

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

来源:千锋教育
发布人:xqq
时间: 2023-10-14 00:49:32 1697215772

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

一般数据库的实现,以Oracle为例,在执行DDL后会隐式提交。所以你看上去好像DDL不会回滚。其实你可以做个实验,在同一个事务里执行几条DML,再执行DDL,再回滚。你会发现DDL之前执行的DML也不会回滚,因为数据库已经帮你提交了。

当然你会问为什么这么实现,这是因为内存空间有限,DDL是修改数据字典,而且通常不会有长时间的DDL执行。数据库自动提交有助于控制数据字典的内存占用,把更多的空间留给DML。

Oracle为了实现DDL可以回滚的功能,且实现多版本读一致性,那么就必须在DDL发生后,将修改的表锁定,避免其他会话的访问造成不一致这会导致Oracle中出现锁升级的情况,并且严重的影响Oracle的并发性,而且会大大增加死锁产生的几率要知道,Oracle的锁机制和多版本读一致性使得Oracle的并发性在所有数据库产品中首屈一指。

显然为了实现DDL的回滚而损失最值得称道的并发性,Oracle认为得不偿失。  

延伸阅读:

二、SQL TRUNCATE TABLE清空表语句

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 却不具备该功能。

总结

当您不再需要该表时,使用 DROP TABLE;当您仍要保留该表,只是想删除所有记录时,使用 TRUNCATE TABLE;当你要删除部分记录时,使用带有 WHERE 子句的 DELETE FROM。
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT