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