sql-server - 更新第二张表时,一张表可以拥有排他锁吗?
问题描述
我在 SQL Server 2016 中工作。我有两个表,一个是工作项队列 ( TQueue
),第二个是TWork
正在处理的工作项 ( )。
我有一个脚本,可以从中获取前 100 个TQueue
没有记录的TWork
项目,然后将这些项目插入TWork
以进行处理。
出于性能原因,我想同时运行脚本的多个实例。挑战在于脚本 1 抓取 100 个项目,并且在提交将这些项目插入其中的事务之前TWork
,脚本 2 获取同一组项目并将它们也插入。
问题
我想阻止读取TQueue
直到插入事务TWork
完成。这可能吗?
解决方案
您可以使用表格提示来实现此目标。
例如:
Create Table Val (ID Int)
Insert Into Val (ID)
Values (0),(1),(2),(3),(4),(5)
第一届:
Set Transaction Isolation level Read Committed
Begin Transaction
Select Top 2 * From Val With (ReadPast, XLock, RowLock)
-- Return 0,1
-- Commit has been commented for illustrative purposes.
-- Don't forget to commit the transaction later.
-- Commit
第二届:
Set Transaction Isolation level Read Committed
Begin Transaction
Select * From Val With (ReadPast, XLock, RowLock)
-- Return 2,3,4,5
Commit
推荐阅读
- vba - 将带有计算的文本框条目输出到Excel工作表的VBA不匹配错误?
- python - 如何在具有条件的 DataFrame 中逐行添加元素?
- mysql - 当我重新启动 docker-compose 的 mariadb 时出错
- javascript - 我的注册帖子请求不断重复
- python - Python子进程为变量赋值
- html - 空的只读输入字段
- jquery - 如何使用jquery滚动文本并追加到最后
- java - 来自 Java Spring Boot,我在哪里可以在 Django Rest Framework 中编写 PUT Endpoint?
- laravel - Laravel8 - 使用多个通配符验证请求
- java - 如何为重复的特定模式将列表中的多个对象分组但保持顺序?