Explicit lock to table(s) in SQL Server?

时间秒杀一切 提交于 2019-12-10 23:48:42

问题


Is it possible to do an explicit shared lock on a table in SQL Server?

I need to do the following:

  • shared lock table
  • copy table to temp table, for manipulation
  • exclusive lock table
  • copy stuff from tempTable to table
  • release all locks

Basically, I want to be sure that nothing is added to the table, while I'm doing stuff to the temp table, but I still want it to be readable.

For some reason, putting the whole thing in a transaction causes a deadlock in some of the stuff I do to the temp table, so that is not an option.


回答1:


The only way to hold table locks is to keep a transaction open. So we may need more information about this "deadlock in some of the stuff I do to the temp table".

Depending on the task, the temp table may not be necessary at all - it sounds like you're building something from a procedural mindset rather than a set-based one.

The basic sketch for what you've outlined would be:

/* Create temp table here */
BEGIN TRANSACTION
INSERT INTO #Table (/* Columns */)
SELECT /* Columns */ FROM SourceTable WITH (UPDLOCK,HOLDLOCK)

/* Work within temp table here */
UPDATE st
SET
   /* Set new column values based on temp table */
FROM
   SourceTable st
       inner join
   #Table t
       on
           /* Key column join here */
COMMIT

You need to specify an UPDATE lock rather than a shared lock, which is effectively "A shared lock now, but I intend to go exclusive later on within the same transaction", to prevent a possible deadlock.



来源:https://stackoverflow.com/questions/5177933/explicit-lock-to-tables-in-sql-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!