oracle 中truncate 和delete的区别

编程小强 2012-12-14 01:36:06
我的存储过程大概是这样子的:
我先truncate B表,然后将A表的数据取出处理后放到B表中,
我想问的是如果多个用户使用这个存储过程的时候,是不是会存在第一个用户还没有使用完B表,第二个用户调用这个存储过程的时候将B表给truncate掉后,这样的话,第一个用户使用的数据将直接丢失了,
请问:
truncate是不是在多个用户同时使用的时候会出现问题?
请详细说明
...全文
309 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程小强 2012-12-14
  • 打赏
  • 举报
回复
按照5楼的可以理解的话,如果并发情况下truncate是需要谨慎使用的,会把其他用户的数据给删除掉了。 我今天就碰到了这个问题,所以发帖问问大家
fw0124 2012-12-14
  • 打赏
  • 举报
回复
顶5楼,如果各个用户之间数据不需要共享,定义成临时表。 CREATE GLOBAL TEMPORARY TABLE
BenChiM888 2012-12-14
  • 打赏
  • 举报
回复
并发处理,从你的逻辑性上来看,你的B表可以truncate 说明他里面的数据的“临时性” B表应该只是作为中转站的作用,所以把B表设计成 global temporary table 你的问题迎刃而解 什么都不用考虑。 因为,一个用户truncate global temporary table 时,别的用户的数据不受它影响。 至于如果B表不是 global temporary table ,你的担忧是对的,在应用中有出现此类问题的隐患,一遍在并发比较大的处理里面不建议使用。
Cryking 2012-12-14
  • 打赏
  • 举报
回复
引用 楼主 l2tp1012 的回复:
我的存储过程大概是这样子的: 我先truncate B表,然后将A表的数据取出处理后放到B表中, 我想问的是如果多个用户使用这个存储过程的时候,是不是会存在第一个用户还没有使用完B表,第二个用户调用这个存储过程的时候将B表给truncate掉后,这样的话,第一个用户使用的数据将直接丢失了, 请问: truncate是不是在多个用户同时使用的时候会出现问题? 请详细说明
你说的情况应该不会出现 这是事务的读一致性决定的,你第一个用户在读取表B的数据的时候,无论任何用户修改都不会影响到你,例如你 for x in select * from b,那么即使别的用户修改了表b,并且提交了,你还是用的原来的数据,不会影响到你的结果,但是一旦你现在这个事务结束了,再去使用B表,那么你的数据将是别的用户修改后的数据
软件钢琴师 2012-12-14
  • 打赏
  • 举报
回复
引用 2 楼 taiguang 的回复:
truncate 属于 DDL delete 属于 DML
truncate直接删除,而不产生重做记录,删除之后 不能恢复了 delete 在没有指定nologging 时 先写重做记录,然后删除,删除之后可以恢复
软件钢琴师 2012-12-14
  • 打赏
  • 举报
回复
truncate 属于 DDL delete 属于 DML
DYFDWX 2012-12-14
  • 打赏
  • 举报
回复
truncate 不会产生回滚段,删除速度快 delete 产生回滚段,速度相对来说慢点,可恢复 rollback

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧