当前位置: 首页 > 面试题库 >

如何排他地锁定行以防止CRUD操作

汪晨
2023-03-14
问题内容

嗨,专家,我如何在SQL Server中锁定行,以防止CRUD操作(甚至是SELECT)。是否有可能?可序列化的隔离级别不会阻止SELECT。谢谢


问题答案:
BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

这样就可以了。

编辑

正如其他人所指出的,您不能将行锁定为不被读取 。我知道这样做的唯一方法如下:

WITH (UPDLOCK, TABLOCK)

并假设在SELECT语句中从未使用过WITH(NOLOCK)(无论如何应避免使用)。

测试了这一点,并且可以正常工作,尽管TABLOCK仅应在极端情况下使用。当然,如果需要并发,那将是一个糟糕的解决方案,并且将需要某种其他形式的锁定。一种方法是更新位列“
Available True / False”,并且仅读取“ Available = True”的行。正如@gbn所建议的,READPAST 可以
与此一起使用。



 类似资料:
  • 问题内容: 我有以下T-SQL代码: 我正在使用带有注释的“锁定”黑客来获取排他锁定。 注意:使用TABLOCKX或UPDLOCK提示将不起作用,因为我通过拆分语句并在中间添加WAITFOR命令进行测试而破坏了ATOMIC- ity。我不要这样的东西: 在同时运行两个会话(带锁表)之后,这是正确的结果 那是运行带有注释的代码的不正确结果 没有这样的黑客,有没有更好的方法来获取交易范围内的排他锁?

  • 问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问

  • 在使用ACK时,有没有一种简单的方法实现类似于“锁定”的东西来防止RabbitMQ队列中的竞争条件? 我有以下问题--我有几个客户机使用ACK使用队列。每当客户端收到消息时,他就会确认并处理消息。但是,如果由于某种原因处理失败,我希望消息返回到队列。

  • 对于CREATE操作,这是存储在数据库中的内容:- 但是,当我执行更新操作时,未更新的字段将变为null 现在,我的问题是如何防止名称和电子邮件变为空??

  • 当使用jqueryui的可排序插件时,存在一个问题,即在开始拖动后将鼠标移动到放置位置上,它会记住这一点,并将鼠标放置在该位置,即使在释放鼠标时没有移动到任何位置。 有没有办法防止这种情况发生,以便在释放鼠标时,如果拖动的portlet未超过放置位置,它会跳回原始位置?

  • 本文向大家介绍怎么防止死锁?相关面试题,主要包含被问及怎么防止死锁?时的应答技巧和注意事项,需要的朋友参考一下 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。 尽量使用 Java. util. concurrent 并发类代替自己手写锁。 尽量