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

解决方案 »

  1.   

    truncate 不会产生回滚段,删除速度快
    delete  产生回滚段,速度相对来说慢点,可恢复 rollback
      

  2.   

    truncate 属于 DDL
    delete 属于 DML
      

  3.   


    truncate直接删除,而不产生重做记录,删除之后 不能恢复了
    delete 在没有指定nologging 时 先写重做记录,然后删除,删除之后可以恢复
      

  4.   

    你说的情况应该不会出现
    这是事务的读一致性决定的,你第一个用户在读取表B的数据的时候,无论任何用户修改都不会影响到你,例如你 for x in select * from b,那么即使别的用户修改了表b,并且提交了,你还是用的原来的数据,不会影响到你的结果,但是一旦你现在这个事务结束了,再去使用B表,那么你的数据将是别的用户修改后的数据
      

  5.   

    并发处理,从你的逻辑性上来看,你的B表可以truncate 说明他里面的数据的“临时性”
    B表应该只是作为中转站的作用,所以把B表设计成 global temporary table 你的问题迎刃而解
    什么都不用考虑。因为,一个用户truncate  global temporary table 时,别的用户的数据不受它影响。
    至于如果B表不是 global temporary table ,你的担忧是对的,在应用中有出现此类问题的隐患,一遍在并发比较大的处理里面不建议使用。
      

  6.   

    顶5楼,如果各个用户之间数据不需要共享,定义成临时表。
    CREATE GLOBAL TEMPORARY TABLE
      

  7.   

    按照5楼的可以理解的话,如果并发情况下truncate是需要谨慎使用的,会把其他用户的数据给删除掉了。
    我今天就碰到了这个问题,所以发帖问问大家