我有一个SSIS包每天截断并加载表,我需要确保在更新时没有人可以访问这些表...因为他可能会得到部分数据。
这样做的最佳方法是什么?
答案 0 :(得分:2)
听起来你需要使用独占表锁,使用以下代码启动你的事务(随意纠正任何语法错误,因为我是postgres / oracle人)
SET TRANSACTION ISOLATION LEVEL TABLOCKX
GO
BEGIN TRANSACTION
在这里做你的工作。然后提交或回滚。
有关详细信息,请参阅this msdn article
答案 1 :(得分:0)
您也可以使用HOLDLOCK或DBLOCK
SQL SERVER - 锁定提示
ROWLOCK 在读取或修改数据时使用行级锁。
PAGLOCK 在读取或修改数据时使用页面级锁定。
TABLOCK 在读取或修改数据时使用表锁。
DBLOCK 在读取或修改数据时使用数据库锁。
UPDLOCK UPDLOCK在不阻塞其他读取器的情况下读取数据,并在以后保证数据自上次读取后未发生更改时进行更新。
XLOCK 在读取表时使用排他锁而不是共享锁,并使用保持锁直到语句或事务结束。
HOLDLOCK 使用保持锁来保持锁定直到事务完成,而不是在不再需要所需的表,行或数据页时立即释放锁。
NOLOCK 这不会锁定任何对象。这是SELECT操作的默认值。它不适用于INSERT,UPDATE和DELETE语句。
实施例:
SELECT OrderID
来自订单(ROWLOCK)
订单ID在100和2000之间
UPDATE Products WITH (NOLOCK)
SET ProductCat = 'Machine'
WHERE ProductSubCat = 'Mac'