【问题标题】:SQL Query Execution more than once?SQL 查询执行不止一次?
【发布时间】:2012-10-08 06:03:41
【问题描述】:

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

我的查询是这样的

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

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

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

【问题讨论】:

  • 表之间的关系如何?
  • @JohnWoo 他们关系不大,我链接的例子中的表格是一样的。

标签: sql sql-server security design-patterns


【解决方案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秒的目的是什么?在交易结束之前他们不是已经锁定了吗?
  • 当然可以!但这是一种选择,可以让锁在一段时间内保持活动状态。例如,如果我们想要插入考试问题并将其表格隐藏到下午 3:00(考试开始时间)。在此之前,任何学生都看不到这些问题。
【解决方案2】:

编辑: 您必须使用一些锁来在更新时锁定数​​据库。 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

【讨论】:

  • 你在我的sql查询中写了第二行,那么第一行和第三行呢?
  • 我认为在这个查询中包含所有三个。不是吗?
  • 我有 1 个 sql 查询和 3 个不同的进程,正如我在问题中的行号所示。
【解决方案3】:

我希望您的表 A 和 B 必须有一些 Primary Key,例如 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.  

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多