select查询会锁表吗?

SqlServer 默认隔离级别是 read committed 提交读,select查询可能会有共享锁,即select操作发生时,update等排他操作进入等待,其他select操作可以进行,共享这把锁。

反之,如果update操作等排它锁还未释放时(即事务没有提交或者回滚),select操作进入等待,获取不了共享锁。

如果是Mysql,隔离级别是可重复读,即一个事务里要保证select出来的数据是一样的。所以隔离级别越高,就越耗资源。

 

读操作可以不需要S LOCK(共享锁)吗?

可以。

1. SELECT * FROM TableName WITH(NOLOCK) 

或者:

2.SQL SEVER有个优化机制,在没有脏读可能的情况下,不需要去申请S LOCK

 

那么,select查询会锁表吗?

有可能,某个查询使用非聚集索引来select数据,那么它会在非聚集索引上持有一个S锁。当有一些select的列不在该索引上,它需要根据rowid找到对应的聚集索引的那行,然后找到其他数据。而此时,第二个的查询中,update正在聚集索引上忙乎:定位、加锁、修改等。但因为正在修改的某个列,是另外一个非聚集索引的某个列,所以此时,它需要同时更改那个非聚集索引的信息,这就需要在那个非聚集索引上,加第二个X锁。select开始等待update的X锁,update开始等待select的S锁,死锁发生了。

 

 

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值