2016-03-22 9 views
3

以下のクエリを使用して、データベースから顧客の詳細を取得しました。トランザクションが開いているときにSQLクエリのタイムアウトエラーを回避する方法はありますか?

方法1:

BEGIN TRAN 
IF EXISTS(SELECT TOP 1 'X' From CUSTOMER Where CustId = @Code AND Status = 'D') 
BEGIN 
    UPDATE CUSTOMER 
    SET Status = 'L' 
    WHERE CustId = @BorrowerCode AND ISNULL(Borrower,'') = 'Y' 

    SELECT CustId, MobileNo, PlaceDesc 
    FROM CUSTOMER C 
    JOIN PLACE P ON C.FKID = P.Pk_Id 
    WHERE Cust_Id = @Code AND C.Status = 'L' 
END 
COMMIT TRAN 

方法2:

BEGIN TRAN 
IF EXISTS(SELECT TOP 1 'X' From CUSTOMER Where CustId = @Code AND Status = 'D') 
BEGIN 
    UPDATE CUSTOMER 
    SET Status = 'L' 
    WHERE CustId = @BorrowerCode AND ISNULL(Borrower,'') = 'Y' 

    SELECT CustId, MobileNo, PlaceDesc 
    FROM CUSTOMER C With(NoLock) 
    JOIN PLACE P With(NoLock) ON C.FKID = P.Pk_Id 
    WHERE Cust_Id = @Code AND C.Status = 'L' 
END 
COMMIT TRAN 

、データベース内のオープン・トランザクションがある場合は、方法1のタイムアウトで失敗するクエリでは、それはですトランザクション内でNoLockを使用するのは良い方法ですか?

UPDATE CUSTOMER 
SET Status = 'L' 
WHERE CustId = @BorrowerCode AND Borrower = 'Y' 

2.Timeうちはかなり巨大な制限があるの下にすべての更新の

1.Firstが検索引数可能ではありません

+2

'SETトランザクション分離レベルをSNAPSHOT' – Devart

+0

@Devart、方法1でTRANSACTION ISOLATION LEVEL SNAPSHOTを使用すると、クエリのタイムアウトは発生しませんか?それが正しいか? – RGS

+3

[悪い習慣を蹴って - どこにでもNOLOCKを置く](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - これはすべての場所でこれを使用することを推奨しません*** - かなり反対! –

答えて

3

いくつかの事..あなたは、としてそれを書き換えるために25回のクエリを試すことができますあなたがタイムアウトしている場合は、この制限があっても、何か間違っている必要があります。私たちは、スナップショットに分離レベルを設定して、選択の妨げにならないnolock.setting分離レベルを備えた包帯を適用しようとしています。 tempDBの使用コスト、スキャンの問題(詳細は以下のリンクを参照してください。)さらに分離レベルはDDL/DMLステートメントには適用されませんが、selectステートメントとc ase、オープンなトランザクションは、DDL/DMLが長時間実行されていることを意味する場合があります。

は要約すると、私は、使用NOLOCKを習慣、私はむしろ、タイムアウトが発生し、また、分離レベルを変更するだけでなく

参照いくつかのテストを必要とする理由を参照しようとします: http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/

+0

NULL部分をスキップするだけです。それは無意味です。 –

+0

ありがとうSean、thats right – TheGameiswar

+0

2点目で言ったことを理解できませんでした。 nolockを省略すると、トランザクションがオープン状態のときにタイムアウトの問題を克服する代替方法は何ですか? – RGS

関連する問題