level 1
氨基酸的味儿
楼主
亲爱的各位吧友们,小弟有一sql问题烦请各位大哥给点思路~ 数据库是2019SQL SERVER. SQL含义就是获取部分状态是初始状态的数据然后更新成下一个状态。因为要考虑并发问题,这里用了事务实现,具体就是事务里面两个sql,第一个sql是查询的时候加锁,第二个sql是更新查询出来的数据状态然后提交事务。查询sql是 select top(10) * from table with(index(设置的非聚簇索引), UPDLOCK, READPAST, ROWLOCK) where 其他条件 = 'xx' and status= '初始状态'。 更新sql是update tableA set status = '下一个阶段状态' where id = xxx(注意这里的id不是主键,该表没有主键)。 查询的非聚簇索引就是 其他条件和status的联合索引,执行的时候发现多事务会触发死锁,明明查询的时候加了行锁 我也从日志中看到了不同事务查询返回的是不同数据,但是一旦更新就会阻塞,最后解决是给id加了主键就好使了,ai搜索后告知的原因说是“ 没有主键的表叫做堆表,锁的时候只能按照RID去锁 锁住的是一个范围,所以更新的时候会阻塞,加了主键后就会按照主键id来行锁,不会有问题”。 但是小弟还是不太理解他说的意思 感觉有点抽象,麻烦有知道的大佬给点思路 怎么能好理解一点~~
2026年01月02日 16点01分
1