トランザクションで次のようなSQL文を実行しようとしています。どのように私はこれを達成することができます誰も助言?最も重要なのは、汚い読み書きがあってはならないということです。ありがとう!SQL Serverクエリの問題
答えて
他の言及として、トランザクションとその分離状態を使用して、ダーティリードを制御します。私はこのことをお勧めします。なぜなら、失敗する可能性のあるコミットされていないトランザクションを読み取ることができ、トレースが困難な競合状態を引き起こす可能性があるからです。
さらに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
質問は明らかですが、私は答えようとします。
あなただけ
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
your query here
COMMIT
間でクエリをフレームにしようとすると、ラウンド中括弧、あるいは何か他のものを使用してサブクエリをフレームに忘れてはいけない - あなたのクエリが
特にsyntaxically正しくないので - 場合あなたはあなたのトランザクション内の他のトランザクションデータからの汚れた読み込みを望みます - 後で(ノーロック)ポストフィックス付きテーブルを使用する
適切な分離レベルを有効にしてクエリを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;
詳細を記入してください。どのようなプログラミング言語を使用していますか?どのコンポーネントをデータベースに接続しますか?あなたはMS Visual Studioでアプリケーションを書いていますか?
または、これをスクリプト内で1回のトランザクションですべて実行しようとしていますか?
まず、上記のコードをすべてストアドされたMSSQLプロシージャに入れて、アプリケーションのコードからプロシージャをコールすることをお勧めします。そうすれば、トランザクション全体をコミットまたは元に戻すことができ、ロジックをデータベース内の1か所に保持することができます。また、SQLやmantainのプロシージャーを、アプリケーションで再コンパイルが必要なものよりも簡単に変更することもできます。
imはVisual Studioとms sql 2008を使用しています。メソッド内でクエリを実行しています – pothios
[OK]をクリックして、[このリンク](http://www.codeproject.com/KB/database/transactions.aspx) 。キーは、db.BeginTransaction()、transaction.Commit()およびtransaction.Rollback()を使用することです。 – talereader
ADOでのストアドプロシージャの使用については、[this](http://www.codeproject.com/KB/cs/)を参照してください。 simplecodeasp.aspx)。また、この場合、質問が.Netのdbトランザクションに関連する場合は、質問の編集を検討し、タグC#と.Net – talereader
- 1. SQL Serverクエリの問題
- 2. SQL Serverのクエリ構文の問題
- 3. SQL Serverの単一クエリの問題
- 4. CTE SQL Serverクエリのパフォーマンスの問題
- 5. SQL Serverの問題
- 6. SQLクエリ問題
- 7. SQLクエリ問題
- 8. Sql server authentication問題
- 9. SQL Server BETWEEN問題
- 10. ASP SQL Serverクエリの質問
- 11. SQLクエリの問題
- 12. SQLクエリの問題
- 13. SQLクエリの問題
- 14. SQLクエリの問題
- 15. SQLクエリの問題
- 16. SQLクエリの問題
- 17. SQL ServerのPKの問題
- 18. SQL Serverのパフォーマンスの問題
- 19. SQL Serverログオンの問題
- 20. SQL Server LIKE句の問題
- 21. SQL Server 2008r2コミットパフォーマンスの問題
- 22. Sql Server 2008 CDCの問題
- 23. sql server 2008スナップショットエージェントの問題
- 24. ASP.NET SessionState SQL Serverの問題
- 25. SQL Serverストアドプロシージャsp_updatestatsの問題
- 26. SQL Serverアカウントの問題
- 27. SQL Server(2005)リンクサーバーの問題
- 28. restore database - sql serverの問題
- 29. SQL Server:サブクエリーの問題900
- 30. SQL Server 2012データベースクエリの問題
汚れた読み込みや書き込みはできません。もしそうなら、修正してください。 – kba
これを指摘してくれてありがとう。 – pothios