0

我有 2 个表(A,B)和 1 个查询

我的查询是这样的

  1. 从 A 中读取
  2. 使用来自 A 的数据更新 B
  3. 使用更新后的表 B,设置 A 的最终值。

示例执行可以在以下问题中找到: Proper way to keep a single data in sql server?

现在,由于所有进程都已连接,因此此查询不应同时执行两次,或者由 2 个不同的用户执行,直到进程结束。我该如何防止这种情况?还是它已经像这样安全地工作了?

4

3 回答 3

1

编辑: 你必须在更新时使用一些锁来锁定数据库。http://msdn.microsoft.com/en-us/library/ms173763.aspx

你的伪代码:

 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

我希望您的表 A 和 B 必须有一些Primary Key例如EmployeeID。在这种情况下,一个简单的解决方案是创建一个表(例如Lock_Table),该表记录被EmployeeID修改的beign。
所以在这里你需要这样:

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 回答
1

Use transaction lock :

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

during the transaction execution, any try to read or write from/to tables will timeout...

于 2012-10-08T06:34:49.063 回答