मुझे इसका उत्तर मिल गया है:मेरा लूपेड डिलीट घोस्ट क्लीनअप प्रो के साथ विरोध कर रहा है।
निकोलस के सुझाव का उपयोग करते हुए, मैंने एक BEGIN TRANSACTION
added जोड़ा और एक COMMIT
. मैंने डिलीट लूप को BEGIN TRY
. में लपेटा है / BEGIN CATCH
. BEGIN CATCH
. में , एक ROLLBACK
. से ठीक पहले , मैंने sp_lock
चलाया और sp_who2
. (मैंने उपरोक्त प्रश्न में कोड परिवर्तन जोड़े हैं।)
जब मेरी प्रक्रिया अवरुद्ध हो गई, तो मैंने निम्न आउटपुट देखा:
spid dbid ObjId IndId Type Resource Mode Status
------ ------ ----------- ------ ---- -------------------------------- -------- ------
20 2 1401108082 0 TAB IX GRANT
20 2 1401108082 1 PAG 1:102368 X GRANT
SPID Status Login HostName BlkBy DBName Command CPUTime DiskIO
---- ---------- ----- -------- ----- ------ ------------- ------- ------
20 BACKGROUND sa . . tempdb GHOST CLEANUP 31 0
भविष्य के संदर्भ के लिए, जब SQL सर्वर रिकॉर्ड हटाता है, तो यह उन पर "भूत रिकॉर्ड" के रूप में चिह्नित करने के लिए थोड़ा सा सेट करता है। हर कुछ मिनटों में, घोस्ट क्लीनअप नामक एक आंतरिक प्रक्रिया पूरी तरह से हटाए गए रिकॉर्ड के पृष्ठों को पुनः प्राप्त करने के लिए चलती है (यानी सभी रिकॉर्ड भूत रिकॉर्ड हैं)।
इस प्रश्न में सर्वरफॉल्ट पर भूत सफाई प्रक्रिया पर चर्चा की गई थी।
यह रहा पॉल एस. रान्डल की भूत सफाई प्रक्रिया की व्याख्या।
ट्रेस फ्लैग के साथ घोस्ट क्लीनअप प्रक्रिया को अक्षम करना संभव है। लेकिन मुझे इस मामले में ऐसा नहीं करना पड़ा।
मैंने 100 एमएस का लॉक वेट टाइमआउट जोड़ना समाप्त कर दिया। यह घोस्ट रिकॉर्ड क्लीनअप प्रक्रिया में समय-समय पर लॉक प्रतीक्षा टाइमआउट का कारण बनता है, लेकिन यह स्वीकार्य है। मैंने अपना लूप भी जोड़ा है जो 5 बार तक लॉक टाइमआउट का पुन:प्रयास करता है। इन दो परिवर्तनों के साथ, मेरी प्रक्रिया अब आमतौर पर पूरी होती है। अब यह केवल एक टाइमआउट प्राप्त करता है यदि बहुत लंबी प्रक्रिया है जो बहुत सारे डेटा को आगे बढ़ाती है जो उस डेटा पर टेबल या पेज लॉक प्राप्त करती है जिसे मेरी प्रक्रिया को साफ करने की आवश्यकता होती है।
संपादित करें 2016-07-20
अंतिम कोड इस तरह दिखता है:
-- Do not block long if records are locked.
SET LOCK_TIMEOUT 100
-- This process volunteers to be a deadlock victim in the case of a deadlock.
SET DEADLOCK_PRIORITY LOW
DECLARE @Error BIT
SET @Error = 0
DECLARE @ErrMsg VARCHAR(1000)
DECLARE @DeletedCount INT
SELECT @DeletedCount = 0
DECLARE @LockTimeoutCount INT
SET @LockTimeoutCount = 0
DECLARE @ContinueDeleting BIT,
@LastDeleteSuccessful BIT
SET @ContinueDeleting = 1
SET @LastDeleteSuccessful = 1
WHILE @ContinueDeleting = 1
BEGIN
DECLARE @RowCount INT
SET @RowCount = 0
BEGIN TRY
BEGIN TRANSACTION
-- The READPAST below attempts to skip over locked records.
-- However, it might still cause a lock wait error (1222) if a page or index is locked, because the delete has to modify indexes.
-- The threshold for row lock escalation to table locks is around 5,000 records,
-- so keep the deleted number smaller than this limit in case we are deleting a large chunk of data.
-- Table name, field, and value are all set dynamically in the actual script.
SET @SQL = N'DELETE TOP (1000) MyTable WITH(ROWLOCK, READPAST) WHERE MyField = SomeValue'
EXEC sp_executesql @SQL, N'@ProcGuid uniqueidentifier', @ProcGUID
SET @RowCount = @@ROWCOUNT
COMMIT
SET @LastDeleteSuccessful = 1
SET @DeletedCount = @DeletedCount + @RowCount
IF @RowCount = 0
BEGIN
SET @ContinueDeleting = 0
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
IF Error_Number() = 1222 -- Lock timeout
BEGIN
IF @LastDeleteSuccessful = 1
BEGIN
-- If we hit a lock timeout, and we had already deleted something successfully, try again.
SET @LastDeleteSuccessful = 0
END
ELSE
BEGIN
-- The last delete failed, too. Give up for now. The job will run again shortly.
SET @ContinueDeleting = 0
END
END
ELSE -- On anything other than a lock timeout, report an error.
BEGIN
SET @ErrMsg = 'An error occurred cleaning up data. Table: MyTable Column: MyColumn Value: SomeValue. Message: ' + ERROR_MESSAGE() + ' Error Number: ' + CONVERT(VARCHAR(20), ERROR_NUMBER()) + ' Line: ' + CONVERT(VARCHAR(20), ERROR_LINE())
PRINT @ErrMsg -- this error message will be included in the SQL Server job history
SET @Error = 1
SET @ContinueDeleting = 0
END
END CATCH
END
IF @Error <> 0
RAISERROR('Not all data could be cleaned up. See previous messages.', 16, 1)