2017-12-06 5 views
1

SQL Serverデータベース内のテーブルからパラメータを読み込み、増分し、それに基づいて他の計算を行い、これらの新しい計算値でSQLクエリを作成します。接続全体のSQL Serverテーブルをロックする

SELECT TOP 1 fruitId 
FROM fruits WITH (TABLOCK, HOLDLOCK) 
WHERE fruitId LIKE '1978%' 
ORDER BY fruitId DESC 

このフルーツIDを取得した後、いくつかの数学が行われ、データがいくつかのテーブルに書き込まれます。

私はこれらの3つのテーブルを1回のトランザクションで書いています。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

BEGIN TRANSACTION 
    INSERT INTO Fruits (fruitId, fruitName, fruitColor) 
    VALUES 197867, 'Apple', 'Red'; 

    INSERT INTO Salad (saladId, saladName) 
    VALUES 1234, 'Apple Salad'; 

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234, 197867; 

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234,197866; 

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234, 197980; 

    COMMIT TRANSACTION 

私のロックは挿入部分に問題ありません。しかし、誰かがフルーツからフルーツアイデアを読むと計算が行われますが、fruitIdはユニークでなければならないので、後でトランザクションコミットのための書き込みコードが失敗します。

接続全体の果物テーブルをロックすることはできますか?

+0

*接続全体の果物テーブルをロックすることは可能ですか? - これが可能だったとしても**これは恐ろしく悪い**アイデアです - 戦略を再考する必要があります道に行く –

+0

私はこれを介して古いアプリケーションに書き込もうとしています。インサートセットは時々50行までで、計算されたfruitIdを使用します。私はあなたが何かを私がこれを見つけることができることを示唆することができますms SQLに新しいですか? –

+0

@marc_sありがとう!私は私のロジックフローを変更し、それは1つのトランザクションに適合しているようだ。 –

答えて

2

いいえ、データロックは、トランザクションによってスコープされる必要があります。

テーブルを排他モードwith (TABLOCKX)にロックする必要があります。あなたの取引は、挿入の両方に及ぶ必要があります。

パフォーマンスは深刻です。

調査​​

+0

ありがとう!私は私のロジックフローを変更し、それは1つのトランザクションでうまく機能しているようです –

関連する問題