Sql全局临时表多人同时调用是否存在问题?怎么解决?

时间:2022-09-08 09:04:58
背景:我有=写个一个存储过程,业务很复杂,所以写了四份存储过程,并依次调用,但是共同的对24条数据进行判断操作。我把数据存在在了全局临时表中。
问题:如果多人同时调用存储过程,这个全局临时表会不会因为已经存在,等其他原因导致异常。
个人觉得可能是存在问题的,向大家求助,有问题的话如何解决比较合理?
谢谢

12 个解决方案

#1


向大家求助。 Sql全局临时表多人同时调用是否存在问题?怎么解决?

#2


如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

#3


引用 2 楼 KanzakiOrange 的回复:
如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表

#4


引用 3 楼 u013351366 的回复:
Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表


如果是并发的情况下,可能会有问题。

比如会话1创建了临时表,然后这个时候,会话2上来了,一看临时表已存在,于是去访问。。。

#5


引用 3 楼 u013351366 的回复:
Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表

比方说会话1先执行,然后创建了全部临时表##A 运行到一半,然后会话2执行,看到##A已经创建了,要么就访问到会话1正在处理的数据,要不就会把会话1创建的##A删除掉,然后重建一个##A 。这个就出现问题了

#6


引用 5 楼 KanzakiOrange 的回复:
Quote: 引用 3 楼 u013351366 的回复:

Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表

比方说会话1先执行,然后创建了全部临时表##A 运行到一半,然后会话2执行,看到##A已经创建了,要么就访问到会话1正在处理的数据,要不就会把会话1创建的##A删除掉,然后重建一个##A 。这个就出现问题了

请问有什么好的解决方案吗?

#7


引用 4 楼 yupeigu 的回复:
Quote: 引用 3 楼 u013351366 的回复:

Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表


如果是并发的情况下,可能会有问题。

比如会话1创建了临时表,然后这个时候,会话2上来了,一看临时表已存在,于是去访问。。。

除了全局临时表,请问还有其他的方法吗?

#8


你的临时表,是怎么定义的 ?

#9


如果这样的话可以试下用表变量。或者可以建个普通表,每次插入的时候记录一个标识列或者什么的,调用完之后把数据删除掉应该也OK

#10


引用 8 楼 wmxcn2000 的回复:
你的临时表,是怎么定义的 ?

##tableName

#11


引用 10 楼 u013351366 的回复:
Quote: 引用 8 楼 wmxcn2000 的回复:

你的临时表,是怎么定义的 ?

##tableName


你是不是想建立一个全局临时表,然后这4个存储过程,共享一个 临时表的数据对吗?

但是并发的情况下,数据可能会出现混乱的情况。建议如果可以的化,可以让每个会话创建属于自己的全局临时表,比如:

select @@spid
是会话id,在创建全局临时表的时候,按照 ##tablename_回话id 这样多个并发的会话,就不会冲突了

#12


引用 11 楼 yupeigu 的回复:
Quote: 引用 10 楼 u013351366 的回复:

Quote: 引用 8 楼 wmxcn2000 的回复:

你的临时表,是怎么定义的 ?

##tableName


你是不是想建立一个全局临时表,然后这4个存储过程,共享一个 临时表的数据对吗?

但是并发的情况下,数据可能会出现混乱的情况。建议如果可以的化,可以让每个会话创建属于自己的全局临时表,比如:

select @@spid
是会话id,在创建全局临时表的时候,按照 ##tablename_回话id 这样多个并发的会话,就不会冲突了

幡然醒悟,非常感谢!

#1


向大家求助。 Sql全局临时表多人同时调用是否存在问题?怎么解决?

#2


如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

#3


引用 2 楼 KanzakiOrange 的回复:
如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表

#4


引用 3 楼 u013351366 的回复:
Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表


如果是并发的情况下,可能会有问题。

比如会话1创建了临时表,然后这个时候,会话2上来了,一看临时表已存在,于是去访问。。。

#5


引用 3 楼 u013351366 的回复:
Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表

比方说会话1先执行,然后创建了全部临时表##A 运行到一半,然后会话2执行,看到##A已经创建了,要么就访问到会话1正在处理的数据,要不就会把会话1创建的##A删除掉,然后重建一个##A 。这个就出现问题了

#6


引用 5 楼 KanzakiOrange 的回复:
Quote: 引用 3 楼 u013351366 的回复:

Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表

比方说会话1先执行,然后创建了全部临时表##A 运行到一半,然后会话2执行,看到##A已经创建了,要么就访问到会话1正在处理的数据,要不就会把会话1创建的##A删除掉,然后重建一个##A 。这个就出现问题了

请问有什么好的解决方案吗?

#7


引用 4 楼 yupeigu 的回复:
Quote: 引用 3 楼 u013351366 的回复:

Quote: 引用 2 楼 KanzakiOrange 的回复:

如果出现并发将会出现2个会话引用同一个对象,如果你的存储过程里面涉及到创建删除表的话将有可能出现引用出错或者存储过程在运行的时候全局临时表被删除掉而报错的情况。这个你需要自己去权衡

我有在存储过程的最后删除全局临时表


如果是并发的情况下,可能会有问题。

比如会话1创建了临时表,然后这个时候,会话2上来了,一看临时表已存在,于是去访问。。。

除了全局临时表,请问还有其他的方法吗?

#8


你的临时表,是怎么定义的 ?

#9


如果这样的话可以试下用表变量。或者可以建个普通表,每次插入的时候记录一个标识列或者什么的,调用完之后把数据删除掉应该也OK

#10


引用 8 楼 wmxcn2000 的回复:
你的临时表,是怎么定义的 ?

##tableName

#11


引用 10 楼 u013351366 的回复:
Quote: 引用 8 楼 wmxcn2000 的回复:

你的临时表,是怎么定义的 ?

##tableName


你是不是想建立一个全局临时表,然后这4个存储过程,共享一个 临时表的数据对吗?

但是并发的情况下,数据可能会出现混乱的情况。建议如果可以的化,可以让每个会话创建属于自己的全局临时表,比如:

select @@spid
是会话id,在创建全局临时表的时候,按照 ##tablename_回话id 这样多个并发的会话,就不会冲突了

#12


引用 11 楼 yupeigu 的回复:
Quote: 引用 10 楼 u013351366 的回复:

Quote: 引用 8 楼 wmxcn2000 的回复:

你的临时表,是怎么定义的 ?

##tableName


你是不是想建立一个全局临时表,然后这4个存储过程,共享一个 临时表的数据对吗?

但是并发的情况下,数据可能会出现混乱的情况。建议如果可以的化,可以让每个会话创建属于自己的全局临时表,比如:

select @@spid
是会话id,在创建全局临时表的时候,按照 ##tablename_回话id 这样多个并发的会话,就不会冲突了

幡然醒悟,非常感谢!