0

2つのテーブル(A、B)と1つのクエリがあります

私の質問はこんな感じです

  1. Aから読む
  2. AからのこのデータでBを更新します
  3. 更新されたテーブルBを使用して、Aの最終値を設定します。

実行例は以下の質問にあります: SQLサーバーに単一のデータを保持する適切な方法は?

これで、すべてのプロセスが接続されたため、このクエリを同時に2回実行したり、プロセスが終了するまで2人の異なるユーザーが実行したりしないでください。これを防ぐにはどうすればよいですか?それとも、すでにこのように安全に動作していますか?

4

3 に答える 3

1

編集: uは、更新中にdbをロックするためにいくつかのロックを使用する必要があります。http://msdn.microsoft.com/en-us/library/ms173763.aspx

uのpsedoコード:

 int x=(select val from tableB)+1
 query="update tableB set tableB.field="+x+"where......." 
 if query executed successfully:
   update tableA
于 2012-10-08T06:10:21.563 に答える
1

トランザクションロックを使用する:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO

BEGIN TRANSACTION

--select * from A
-- update B ....
--update A

WAITFOR DELAY '00:00:02'   -- tables remain locked for 2 secs   hh:mm:ss

commit TRANSACTION

トランザクションの実行中に、テーブルからの読み取りまたはテーブルへの書き込みを試みると、タイムアウトになります...

于 2012-10-08T06:34:49.063 に答える
1

Primary Key私はあなたのテーブルAとBがいくつかを持っているに違いないことを願っていますEmployeeID。このような場合の簡単な解決策は、変更された良性Lock_Tableの記録を保持するテーブル(たとえば)を作成することです。 したがって、ここでは次のようにする必要があります。 EmployeeID

BEGIN TRANSACTION  
1- Read EmployeeID From A   
2- Check if EmployeeID already exists in Lock_Table. If Yes then Quit Else insert that EmployeeID in Lock_Table
3- Update B with this data(EmployeeID in this case) from A   
4- Using the updated table B, set final value of A.   
5- Delete this EmployeeID from the Lock_Table   
 COMMIT TRANSACTION

On any error ROLLBACK the Transaction.  

それが役に立てば幸い。

于 2012-10-08T07:07:39.133 に答える