2011-12-20 23 views
2

トランザクションで次のようなSQL文を実行しようとしています。どのように私はこれを達成することができます誰も助言?最も重要なのは、汚い読み書きがあってはならないということです。ありがとう!SQL Serverクエリの問題

+0

汚れた読み込みや書き込みはできません。もしそうなら、修正してください。 – kba

+0

これを指摘してくれてありがとう。 – pothios

答えて

0

他の言及として、トランザクションとその分離状態を使用して、ダーティリードを制御します。私はこのことをお勧めします。なぜなら、失敗する可能性のあるコミットされていないトランザクションを読み取ることができ、トレースが困難な競合状態を引き起こす可能性があるからです。

さらに1つのデータ変更を行っているので、トランザクションを明示的にロールバックする必要があります。最後に、SQLを修正する必要がありました。出力節を利用することは、おそらく良い考えです。

BEGIN TRANSACTION; 

BEGIN TRY 


    DECLARE @Item table (item_no int) 
    DECLARE @part table (part_no int) 

    UPDATE TOP 1 ITEMS 
    SET assigned = 1 
    WHERE 
      item_code = @item_code 
      AND store_id = @store_id 
    OUTPUT 
      inserted.item_no 
    INTO @Item 

    UPDATE TOP 1 parts 
    SET issued = 1 
    OUTPUT 
      inserted.part_no 
    INTO @part 


    INSERT INTO issued_hardware 
    SELECT item_no, GetDate(), @UserName 
    FROM @item, @part; 





END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION; 
GO 
+0

を追加してください。他のトランザクションが項目パラメータと部分パラメータ値を上書きできるかどうか疑問に思っています不正確な挿入が発生します。 – pothios

+0

バッチまたはストアドプロシージャのローカル変数は実行のローカルなので、オーバーライドすることはできません。 –

+0

私はcommand.CommandText = "ここでのSQL文"を使用しています 私はストアドプロシージャに変更し、私のメソッドから呼び出すことをお勧めしますか? – pothios

1

質問は明らかですが、私は答えようとします。

あなただけ

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
BEGIN TRAN 

your query here 

COMMIT 

間でクエリをフレームにしようとすると、ラウンド中括弧、あるいは何か他のものを使用してサブクエリをフレームに忘れてはいけない - あなたのクエリが

特にsyntaxically正しくないので - 場合あなたはあなたのトランザクション内の他のトランザクションデータからの汚れた読み込みを望みます - 後で(ノーロック)ポストフィックス付きテーブルを使用する

2

適切な分離レベルを有効にしてクエリをBEGIN TRAN identifier,COMMIT TRAN identifier

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
BEGIN TRAN T1; 
UPDATE items SET assigned = 1 
WHERE 
    SELECT TOP 1 @item_no = item_no 
    FROM items 
    WHERE item_code = @item_code 
    AND store_id = @store_id; 

UPDATE parts SET issued = 1 
WHERE 
    SELECT TOP 1 @part_no = part_no 
    FROM parts 
    WHERE part_id = part_id; 

INSERT INTO issued_hardware (@item_no, @part_no, DateTime.now, @username); 
COMMIT TRAN T1; 
0

詳細を記入してください。どのようなプログラミング言語を使用していますか?どのコンポーネントをデータベースに接続しますか?あなたはMS Visual Studioでアプリケーションを書いていますか?

または、これをスクリプト内で1回のトランザクションですべて実行しようとしていますか?

まず、上記のコードをすべてストアドされたMSSQLプロシージャに入れて、アプリケーションのコードからプロシージャをコールすることをお勧めします。そうすれば、トランザクション全体をコミットまたは元に戻すことができ、ロジックをデータベース内の1か所に保持することができます。また、SQLやmantainのプロシージャーを、アプリケーションで再コンパイルが必要なものよりも簡単に変更することもできます。

+0

imはVisual Studioとms sql 2008を使用しています。メソッド内でクエリを実行しています – pothios

+0

[OK]をクリックして、[このリンク](http://www.codeproject.com/KB/database/transactions.aspx) 。キーは、db.BeginTransaction()、transaction.Commit()およびtransaction.Rollback()を使用することです。 – talereader

+0

ADOでのストアドプロシージャの使用については、[this](http://www.codeproject.com/KB/cs/)を参照してください。 simplecodeasp.aspx)。また、この場合、質問が.Netのdbトランザクションに関連する場合は、質問の編集を検討し、タグC#と.Net – talereader