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