【发布时间】:2021-09-21 13:58:51
【问题描述】:
假设我们有一个类似这样的表:
CREATE TABLE employee (
id INT PRIMARY KEY,
department_id INT NOT NULL,
first_name NVARCHAR(200) NOT NULL
)
可能有多个并发事务在此表的记录上操作。如果它们操作相同的department_id,它们应该是可序列化/同步的(即等待彼此提交或回滚):
-- 1-st statement
BEGIN TRANSACTION
-- 2-nd
SELECT * FROM employee WITH (ROWLOCK, XLOCK, HOLDLOCK) WHERE department_id = :department_id
-- 3-nd
... main logic ...
-- 4-th
COMMIT TRANSACTION
我想要实现的是避免在第二个语句中将所有这些记录获取到客户端(在我的情况下是 Java 应用程序),而是将它们锁定在数据库中以进行此事务,例如通过调用一些内置的存储过程(在我的例子中是动态 SQL):
-- 1-st statement
BEGIN TRANSACTION
-- 2-nd, something like that
CALL sp_lock 'employee' 'ROWLOCK, XLOCK, HOLDLOCK' 'department_id = :department_id'
-- 3-nd
... main logic ...
-- 4-th
COMMIT TRANSACTION
在 MS SQL Server 中是否可行(在我的情况下也是 Java/JDBC)?
【问题讨论】:
-
您正在寻找sp_getapplock。
-
听起来像是个主意……
-
您是否还需要锁定以相同
department_id插入的任何新 记录?我很想知道为什么你想要这个,与标准锁定相比,它提供了什么?
标签: java sql sql-server jdbc