2010-04-05 45 views
0

我有一個存儲過程來得到我想要的數據:我可以使用ROWLOCK,UPDLOCK鎖定連接sql語句中的記錄嗎?

SELECT a.SONum, a.Seq1, a.SptNum, a.Qty1, a.SalUniPriP, a.PayNum, a.InvNum, 
a.BLNum, c.ETD, c.ShpNum, f.IssBan 
FROM OrdD a JOIN OrdH b ON a.SONum = b.SONum 
LEFT JOIN Invh c ON a.InvNum = c.InvNum 
LEFT JOIN cus d ON b.CusCod = d.CusCod 
LEFT JOIN BL e ON a.BLNum = e.BLNum 
LEFT JOIN PayMasH f ON f.PayNum = a.PayNum 
LEFT JOIN Shipment g ON g.ShpNum = c.ShpNum 
WHERE b.CusCod IN (SELECT CusCod FROM UsrInc WHERE [email protected] and [email protected]) AND d.CusGrp = @CusGrp 

後,我得到這些記錄到光標,我使用ROWLOCK,UPDLOCK鎖定所有相關的發票號碼。 SELECT INVNUM FROM Invh WITH(ROWLOCK,UPDLOCK)WHERE INVNUM =

我可以發出鎖在桌子上INVH在一點上,我使用我的存儲過程join命令的幾個表中選擇表?

任何建議,請!

+0

我有2個問題。你爲什麼使用遊標?你正在使用哪種RDBMS? – IamIC 2011-01-05 21:01:04

回答

0

是的,你可以,只要你正確地格式化你的SQL。您需要的一般模式如下:

BEGIN TRAN 

SELECT * 
FROM  table_1 AS t1 {WITH (UPDLOCK, ROWLOCK)} 
JOIN  table_2 AS t2 {WITH (UPDLOCK, ROWLOCK)} 
ON  t1.a = t2.a 

COMMIT TRAN -- locking ends here 

其中{}是可選的(省略{})。因此,如果您在每個希望鎖定的表上添加「WITH(UPDLOCK,ROWLOCK)」子句,就會鎖定,它將起作用。

所以你可以把鎖放在你想要的地方,根據你的問題。

相關問題