我有一个复杂的选择查询和一个巨大的表。
我正在运行此select
语句,同时有一条Update
语句到达并尝试 更新 表。
恕我直言-更新需要 排他 锁-因此update语句将不得不 等待 select命令完成。
我对吗 ?
我该怎么才能做到:执行复杂的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