4

我有一个 ASP.NET Web 应用程序,它填充 SQL Server 2008 数据库表,如下所示:

INSERT INTO tblName1 (col1, col2, col3)
VALUES(1, 2, 3)

我还有一个单独的服务应用程序,它通过首先重命名该表,然后创建一个空表来处理该表的内容(在后台):

SET XACT_ABORT ON
BEGIN TRANSACTION

--Rename table
EXEC sp_rename 'tblName1', 'temp_tblName1'

--Create new table
CREATE TABLE tblName1(
id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
col1 INT,
col2 INT,
col3 INT
)
COMMIT

SET XACT_ABORT OFF
--Begin working with the 'temp_tblName1' table

我不确定在这种情况下我需要在tblName1表上使用哪个 SQL 锁?

PS。为您提供这两个代码示例运行的频率:第一个可能每秒运行几次(尽管大多数时候,频率较低),第二个 - 一天两次。

4

1 回答 1

0

正如一些评论所建议的那样,请考虑以不同的方式执行此操作。您可能会受益于使用快照隔离级别。使用快照隔离需要在数据库上ALLOW_SNAPSHOT_ISOLATION设置。ON此设置默认关闭,因此您需要检查是否可以打开它。

一旦您能够使用快照隔离,您就不需要更改您的INSERT语句,但您的其他流程可能会更改为:

SET XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION

-- Do whatever this process does, but don't rename the table.

-- If you want to get rid of the old records:
DELETE [tblName1] WHERE 1 = 1
-- Then
COMMIT TRANSACTION

如果您确实出于某种原因确实需要创建一个新的非临时表,您可能需要在进入事务之前这样做,因为在快照隔离期间允许您执行的操作有一些限制。

于 2013-04-27T16:36:16.247 回答