求一个查询锁定记录

f231283608 2017-05-02 11:32:31
有3个客户端,每个客户端隔一段时间都回去数据库抓取数据,抓取出来后会修改状态。要怎么加锁才能查询修改状态时,如果有并发,让其他客户端不能查询到这条数据?
...全文
452 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
f231283608 2017-05-03
  • 打赏
  • 举报
回复
直接用TABLOCKX好像可以3个一起来,然后一个接一个的排队等着。
f231283608 2017-05-03
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
事务里边加更新锁,类似这样,仅供参考:
BEGIN TRAN

SELECT  *
FROM    表 WITH ( UPDLOCK, HOLDLOCK )--加更新锁,并保持到事务结束
   
UPDATE  表 SET  字段 = '123'

COMMIT TRAN
另外如果同时执行3个,第3个会死锁。。
二月十六 2017-05-03
  • 打赏
  • 举报
回复
引用 11 楼 f231283608 的回复:
另外总感觉我这种情况这样用锁不是很合适,我现在只要要取一条记录,马上改变状态,让其他客户端取不到而已;需求仅仅是不能让2个客户端获取到同一条,并不是要其他客户端等待这条记录修改完,在获取。 我这只是任务分发,这样用锁更适合于订单提交和商品数量获取之类的。
那就在第二次获取第三次获取的时候加条件,状态为为改变前的
f231283608 2017-05-03
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 9 楼 f231283608 的回复:] 刚测了rowlock果然可以。然后又学习了下UPDLOCK和rowlock,对UPDLOCK的描述是“要是修改的话只能等这些语句完成后才能操作.”。死锁的原因是因为第一个事务在执行时,第2个事务在等待第1个,第3个又在等待第2个,这时第一个还未执行完,这样第3个就死锁了?
这三个更新的是同一条数据?[/quote] 只有第一个事务更新了数据,后面2个仅仅是获取数据,如果用UPDLOCK第3个事务必定死锁。
f231283608 2017-05-03
  • 打赏
  • 举报
回复
另外总感觉我这种情况这样用锁不是很合适,我现在只要要取一条记录,马上改变状态,让其他客户端取不到而已;需求仅仅是不能让2个客户端获取到同一条,并不是要其他客户端等待这条记录修改完,在获取。 我这只是任务分发,这样用锁更适合于订单提交和商品数量获取之类的。
二月十六 2017-05-03
  • 打赏
  • 举报
回复
引用 9 楼 f231283608 的回复:
刚测了rowlock果然可以。然后又学习了下UPDLOCK和rowlock,对UPDLOCK的描述是“要是修改的话只能等这些语句完成后才能操作.”。死锁的原因是因为第一个事务在执行时,第2个事务在等待第1个,第3个又在等待第2个,这时第一个还未执行完,这样第3个就死锁了?
这三个更新的是同一条数据?
f231283608 2017-05-03
  • 打赏
  • 举报
回复
刚测了rowlock果然可以。然后又学习了下UPDLOCK和rowlock,对UPDLOCK的描述是“要是修改的话只能等这些语句完成后才能操作.”。死锁的原因是因为第一个事务在执行时,第2个事务在等待第1个,第3个又在等待第2个,这时第一个还未执行完,这样第3个就死锁了?
二月十六 2017-05-03
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 yenange 的回复:] 更新全表?
忘了改下边的update了。。。[/quote]
BEGIN TRAN
 
SELECT  *
FROM    表 WITH ( ROWLOCK, UPDLOCK )--加更新锁,并保持到事务结束
WHERE   id = 1
    
UPDATE  表
SET     字段 = '123'
WHERE   id = 1

COMMIT TRAN
二月十六 2017-05-03
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
更新全表?
忘了改下边的update了。。。
吉普赛的歌 2017-05-03
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 2 楼 f231283608 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 事务里边加更新锁,类似这样,仅供参考:
BEGIN TRAN

SELECT  *
FROM    表 WITH ( UPDLOCK, HOLDLOCK )--加更新锁,并保持到事务结束
   
UPDATE  表 SET  字段 = '123'

COMMIT TRAN
刚 测试了 ,确实可以 ,在第一个客户端执行事务时 ,将整张表都锁定了,其他查询会延迟,等待第一个事务执行完。 但是有没有更好的方案,只锁定制定行?比如第一个事务执行select * from table where column1='a';waitfor delay '00:00:10',此时 其他客户端来查询 table表时,不需要等待第一个事务执行完,而是在第一个事务执行时间内,查询不到column1='a'的记录。[/quote] 可以试试rowlock。TABLOCKX的话更慢
BEGIN TRAN

SELECT  *
FROM    表 WITH ( ROWLOCK, UPDLOCK )--加更新锁,并保持到事务结束
WHERE   id = 1
   
UPDATE  表
SET     字段 = '123'

COMMIT TRAN
[/quote] 更新全表?
二月十六 2017-05-03
  • 打赏
  • 举报
回复
引用 2 楼 f231283608 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 事务里边加更新锁,类似这样,仅供参考:
BEGIN TRAN

SELECT  *
FROM    表 WITH ( UPDLOCK, HOLDLOCK )--加更新锁,并保持到事务结束
   
UPDATE  表 SET  字段 = '123'

COMMIT TRAN
刚 测试了 ,确实可以 ,在第一个客户端执行事务时 ,将整张表都锁定了,其他查询会延迟,等待第一个事务执行完。 但是有没有更好的方案,只锁定制定行?比如第一个事务执行select * from table where column1='a';waitfor delay '00:00:10',此时 其他客户端来查询 table表时,不需要等待第一个事务执行完,而是在第一个事务执行时间内,查询不到column1='a'的记录。[/quote] 可以试试rowlock。TABLOCKX的话更慢
BEGIN TRAN

SELECT  *
FROM    表 WITH ( ROWLOCK, UPDLOCK )--加更新锁,并保持到事务结束
WHERE   id = 1
   
UPDATE  表
SET     字段 = '123'

COMMIT TRAN
f231283608 2017-05-02
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
事务里边加更新锁,类似这样,仅供参考:
BEGIN TRAN

SELECT  *
FROM    表 WITH ( UPDLOCK, HOLDLOCK )--加更新锁,并保持到事务结束
   
UPDATE  表 SET  字段 = '123'

COMMIT TRAN
刚 测试了 ,确实可以 ,在第一个客户端执行事务时 ,将整张表都锁定了,其他查询会延迟,等待第一个事务执行完。 但是有没有更好的方案,只锁定制定行?比如第一个事务执行select * from table where column1='a';waitfor delay '00:00:10',此时 其他客户端来查询 table表时,不需要等待第一个事务执行完,而是在第一个事务执行时间内,查询不到column1='a'的记录。
二月十六 2017-05-02
  • 打赏
  • 举报
回复
事务里边加更新锁,类似这样,仅供参考:
BEGIN TRAN

SELECT  *
FROM    表 WITH ( UPDLOCK, HOLDLOCK )--加更新锁,并保持到事务结束
   
UPDATE  表 SET  字段 = '123'

COMMIT TRAN

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧