日期:2014-05-17  浏览次数:20727 次

oracle 中truncate 和delete的区别
我的存储过程大概是这样子的:
  我先truncate B表,然后将A表的数据取出处理后放到B表中,
我想问的是如果多个用户使用这个存储过程的时候,是不是会存在第一个用户还没有使用完B表,第二个用户调用这个存储过程的时候将B表给truncate掉后,这样的话,第一个用户使用的数据将直接丢失了,
请问:
  truncate是不是在多个用户同时使用的时候会出现问题?
请详细说明
------解决方案--------------------
引用:
truncate 属于 DDL
delete 属于 DML


truncate直接删除,而不产生重做记录,删除之后 不能恢复了
delete 在没有指定nologging 时 先写重做记录,然后删除,删除之后可以恢复
------解决方案--------------------
引用:
我的存储过程大概是这样子的:
  我先truncate B表,然后将A表的数据取出处理后放到B表中,
我想问的是如果多个用户使用这个存储过程的时候,是不是会存在第一个用户还没有使用完B表,第二个用户调用这个存储过程的时候将B表给truncate掉后,这样的话,第一个用户使用的数据将直接丢失了,
请问:
  truncate是不是在多个用户同时使用的时候会出现问题?
请详细说明

你说的情况应该不会出现
这是事务的读一致性决定的,你第一个用户在读取表B的数据的时候,无论任何用户修改都不会影响到你,例如你 for x in select * from b,那么即使别的用户修改了表b,并且提交了,你还是用的原来的数据,不会影响到你的结果,但是一旦你现在这个事务结束了,再去使用B表,那么你的数据将是别的用户修改后的数据
------解决方案--------------------
并发处理,从你的逻辑性上来看,你的B表可以truncate 说明他里面的数据的“临时性”
B表应该只是作为中转站的作用,所以把B表设计成 global temporary table 你的问题迎刃而解
什么都不用考虑。

因为,一个用户truncate  global temporary table 时,别的用户的数据不受它影响。


至于如果B表不是 global temporary table ,你的担忧是对的,在应用中有出现此类问题的隐患,一遍在并发比较大的处理里面不建议使用。
------解决方案--------------------
顶5楼,如果各个用户之间数据不需要共享,定义成临时表。
CREATE GLOBAL TEMPORARY TABLE