Sql server 修改表以处理SPID

Sql server 修改表以处理SPID,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有一个表格,每当用户点击我网站上的一个选项时,新数据就会被填充。我通过ManagementStudio创建了这个表,我想澄清一下,我每次都不是通过存储过程创建这个表,也不是使用任何类型的内存中临时表 每当用户单击“我的网站”上的某个选项时,将首先删除此表中的旧记录,并填充新记录。我担心当许多用户从我的网站上单击同一选项时可能会出现并发问题。我不知道SQL Server将如何处理此表中的多个删除和插入 我在某个地方读到,SQLServer服务会自动处理这个问题,为每个会话提供一个单独的表的会话副

我有一个表格,每当用户点击我网站上的一个选项时,新数据就会被填充。我通过ManagementStudio创建了这个表,我想澄清一下,我每次都不是通过存储过程创建这个表,也不是使用任何类型的内存中临时表

每当用户单击“我的网站”上的某个选项时,将首先删除此表中的旧记录,并填充新记录。我担心当许多用户从我的网站上单击同一选项时可能会出现并发问题。我不知道SQL Server将如何处理此表中的多个删除和插入

我在某个地方读到,SQLServer服务会自动处理这个问题,为每个会话提供一个单独的表的会话副本


是否需要在我的表中添加SPID,或者它会自动处理?我是否需要将隔离级别从Read Committed更改为Serializable?

您要问的问题的一般答案是,是的,您需要在表中有某种会话标识符列,并将每个用户/会话的值传递给所有在该列上操作的存储过程和/或SQL语句桌子

另一种选择是,可以将隔离级别设置为可序列化,让用户一个接一个地排队,直到前面的每个人都完成了,然后让SQL Server来处理,但这几乎不是您想要做的

因此,大致来说,对于第一个选项,您将得到如下结果:

你的桌子

  ID     DataCol1    DataCol2   DataCol3 .... User/SessionID
因此,用户在您的站点上登录/启动会话。您可以使用他们的ID或为他们生成SessionID并将其传递给

StoredProc1ClearSession @UserSessionID      
StoredProc2InsertNewData  (AnyOtherParamsYouHave),@UserSessionID
StoredProc3RetrieveData   (AnyOtherParamsYouHave),@UserSessionID
你明白了

基本上,只要用于触摸表的每条SQL语句都作为WHERE子句或insert语句的一部分:

UserSessionID or @UserSessionID
那么,您很可能已经拥有了一个可以由多个用户同时安全共享的表,正如您所描述的那样

第二种选择,请 因此,你意识到自己陷入了什么境地。:)

然后像这样写代码

CREATE PROC yourstoredproc
paramaterslisted
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

YOURCODE TOUCHING TEMPTABLE HERE

COMMIT TRANSACTION;
以防您没有阅读链接:

可序列化 指定以下内容:

这将阻止其他事务更新或插入符合当前事务执行的任何语句的任何行。这意味着,如果事务中的任何语句再次执行,它们将读取相同的行集。范围锁一直保持到事务完成。这是最严格的隔离级别,因为它锁定整个密钥范围,并在事务完成之前保持锁。由于并发性较低,因此仅在必要时使用此选项。此选项与在事务中所有SELECT语句中的所有表上设置HOLDLOCK的效果相同。

您提到的“每个会话单独复制”听起来像快照隔离,默认情况下未启用

尽管细节在某种程度上取决于您同时进行的其他事务,但一般来说,只需将DELETE和INSERT命令包装到单个事务中就足够了。您不需要增加隔离级别

BEGIN TRAN
DELETE ...
INSERT ...
COMMIT TRAN

第一种方法目前不可行,因为需要修改两个存储过程。第二种改变隔离级别的方法现在似乎很容易。我需要在处理临时表的存储过程之上添加什么语法?