SQL查询执行不止一次?

时间:2012-10-08 06:03:41

标签: sql sql-server security design-patterns

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

我的查询是这样的

  1. 从A中读取
  2. 使用A
  3. 中的数据更新B.
  4. 使用更新的表B,设置A的最终值。
  5. 示例执行可以在以下问题中找到: Proper way to keep a single data in sql server?

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

3 个答案:

答案 0 :(得分:1)

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

你的psedo代码:

 int x=(select val from tableB)+1
 query="update tableB set tableB.field="+x+"where......." 
 if query executed successfully:
   update tableA

答案 1 :(得分: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

在事务执行期间,任何尝试从/向表读取或写入都会超时......

答案 2 :(得分: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.  

希望它有所帮助。