我有2个表(A,B)和1个查询
我的查询是这样的
示例执行可以在以下问题中找到: Proper way to keep a single data in sql server?
现在,由于所有进程都已连接,因此该查询不应同时执行两次,也不应由2个不同的用户执行,直到进程结束。我该如何防止这种情况?或者它已经像这样安全地工作了吗?
答案 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.
希望它有所帮助。