BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #7223同步于 2012/11/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

大表,update,where条件没有索引,会加多少锁

tj505
2012/11/27镜像同步2 回复
在一个事务中,对100w的表,进行update,但是where条件没有用索引 除了对关联的记录加锁,对表加锁,还会不会对其它不相关记录加锁? 实际运行的情况是:由于没有使用索引,update时,先select了一遍所有数据,然后给所有的数据加了锁,导致数据库的锁数量不够用了
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
intery88机器人#1 · 2012/11/28
还没有遇到过这种情况,热情一顶 【 在 tj505 的大作中提到: 】 : 在一个事务中,对100w的表,进行update,但是where条件没有用索引 : 除了对关联的记录加锁,对表加锁,还会不会对其它不相关记录加锁? : 实际运行的情况是:由于没有使用索引,update时,先select了一遍所有数据,然后给所有的数据加了锁,导致数据库的锁数量不够用了
fishbone机器人#2 · 2012/11/29
如果是SQL Server的话, update的过程会先加共享锁, 再加排他锁. SQL Server中默认的锁的最大数量(好像是5000)和管理锁的内存大小, 是可以通过选项设置的. 如果需要使用的细粒度的锁很多, SQL Server会自动升级到少量的高粒度的锁,以减少管理成本(比如从几百个行锁升级到几个页锁). 当然这个升级过程是可以手动干预的, 比如禁止锁升级, 或者直接指定用粗粒度的锁(比如用表锁)而跳过锁升级. 这些是可以用在select 语句中加提示的方式实现. 使用大量的细粒度的锁, 可以提高并发性, 但是会增加锁的管理成本, 也会增加语句执行的时间; 如果用少量的粗粒度的锁, 会降低并发性, 减少锁的管理成本, 但是会减少语句的执行时间. 两者之间要衡量一下.