我的存储过程大概是这样子的:
我先truncate B表,然后将A表的数据取出处理后放到B表中,
我想问的是如果多个用户使用这个存储过程的时候,是不是会存在第一个用户还没有使用完B表,第二个用户调用这个存储过程的时候将B表给truncate掉后,这样的话,第一个用户使用的数据将直接丢失了,
请问:
truncate是不是在多个用户同时使用的时候会出现问题?
请详细说明
我先truncate B表,然后将A表的数据取出处理后放到B表中,
我想问的是如果多个用户使用这个存储过程的时候,是不是会存在第一个用户还没有使用完B表,第二个用户调用这个存储过程的时候将B表给truncate掉后,这样的话,第一个用户使用的数据将直接丢失了,
请问:
truncate是不是在多个用户同时使用的时候会出现问题?
请详细说明
delete 产生回滚段,速度相对来说慢点,可恢复 rollback
delete 属于 DML
truncate直接删除,而不产生重做记录,删除之后 不能恢复了
delete 在没有指定nologging 时 先写重做记录,然后删除,删除之后可以恢复
这是事务的读一致性决定的,你第一个用户在读取表B的数据的时候,无论任何用户修改都不会影响到你,例如你 for x in select * from b,那么即使别的用户修改了表b,并且提交了,你还是用的原来的数据,不会影响到你的结果,但是一旦你现在这个事务结束了,再去使用B表,那么你的数据将是别的用户修改后的数据
B表应该只是作为中转站的作用,所以把B表设计成 global temporary table 你的问题迎刃而解
什么都不用考虑。因为,一个用户truncate global temporary table 时,别的用户的数据不受它影响。
至于如果B表不是 global temporary table ,你的担忧是对的,在应用中有出现此类问题的隐患,一遍在并发比较大的处理里面不建议使用。
CREATE GLOBAL TEMPORARY TABLE
我今天就碰到了这个问题,所以发帖问问大家