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

SQL Server-[SELECT]会锁定[UPDATE]吗?

钱卓君
2023-03-14
问题内容

我有一个复杂的选择查询和一个巨大的表。

我正在运行此select语句,同时有一条Update语句到达并尝试 更新 表。

恕我直言-更新需要 排他 锁-因此update语句将不得不 等待 select命令完成。

  1. 我对吗 ?

  2. 我该怎么才能做到:执行复杂的select并且 也让update命令运行( 目前我不在乎脏数据


问题答案:

是的-在一定程度上。

多长时间,SELECT取决于事务的隔离级别上共享锁认为:

  • READ UNCOMMITTED-完全不获取共享锁-UPDATE不被阻止
  • READ COMMITTED-仅在读取数据期间获得共享锁-UPDATE可能在很短的时间内被阻止
  • REPEATABLE READ并且SERIALIZABLE-共享锁被获取并一直保留到事务结束-UPDATE被阻止直到SELECT事务结束

从技术上讲,该UPDATE语句首先在读取要更新的行的当前值的时间内获得一个UPDATE锁-与共享锁兼容(由所使用SELECT)。

完成后,该Update锁将升级为独占锁,以便将新数据写入表中。



 类似资料:
  • 问题内容: 我有以下结构的查询: 这是InnoDB表上的单表SELECT语句。字段(INT NOT NULL)上有一个索引。状态为ENUM,并且也已建立索引。 手册页说,它锁定了它读取的所有行。我是否正确理解,在这种情况下,只有一行会被锁定?或更确切地说,它将锁定整个表? 有可能确定哪些行将被查询锁定吗?如果是,怎么办?对空表的查询解释如下: 问题答案: 这是一个很好的问题。InnoDB是行级锁定

  • 是否可以在 SQL SERVER 中的事务中使用 SELECT 语句锁定行?我想锁定该行,以便外部的其他事务无法访问该行。 提交或回滚事务后,应释放该行。这就是我的意思。。。 有人有建议吗?我应该执行 UPDATE 语句来锁定该行吗? 请不要将此问题标记为重复问题。因为,我不是在问UPDATE语句,而是在问SELECT 编辑:我试图“设置事务隔离级别串行化”,但这锁定了太多东西。我的SP很大,它有

  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 问题内容: 这不是完整/正确的MySQL查询伪代码: http://dev.mysql.com/doc/refman/5.0/en/select.html指出:如果将FOR UPDATE与使用页面或行锁的存储引擎一起使用,则查询所检查的行将被写锁,直到当前交易结束 是这里只有被MySQL锁定返回的一条记录还是必须扫描以查找单个记录的所有记录? 问题答案: 我们为什么不尝试一下呢? 设置数据库 现在

  • 假设表 和 都有一行,则查询 应该有两个行级锁(一个在 A 上,一个在 B 上)。是否有任何定义的顺序来获取锁?有没有办法要求表 b 中的锁在来自 a 的锁之前获得锁定(以避免与其他事务死锁)?

  • 问题内容: 请帮助我了解后面的用例。 问题1 :以下是何时应使用的好例子吗? 鉴于: 房间[id] 标签[ID,名称] room_tags [room_id,tag_id] room_id和tag_id是外键 该应用程序希望列出所有房间及其标签,但是需要区分没有标签的房间和已删除的房间。如果不使用SELECT … FOR UPDATE,则可能发生以下情况: 原来: 房间包含 标签包含 room_t