大家都知道select获得的是共享锁,许多用户可以同时查询相同的数据。
但是我有一个疑问!?1.如果数据是从内存中获得那么共享锁可以说的通。2.如果数据不在内存中,而要从磁盘读取??一个磁盘有多少个磁头?应该只有一个吧。如果几个用户访问相同的数据,而这数据不在内存中。
问他们可以同时读取数据?这个时候共享锁该怎么解释呢?
但是我有一个疑问!?1.如果数据是从内存中获得那么共享锁可以说的通。2.如果数据不在内存中,而要从磁盘读取??一个磁盘有多少个磁头?应该只有一个吧。如果几个用户访问相同的数据,而这数据不在内存中。
问他们可以同时读取数据?这个时候共享锁该怎么解释呢?
select的时候不是会加共享锁的吗? 具体我如何查看我也不知道,听书上说的。
你可以测试一下
打开一个cursor,然后查询v$lock.
2,取数据-->共享内存中寻找-->如果内存中不存在-->从磁盘区,然后放入内存--返回。
select 共享锁不存在的。
相同的select 会把结果集保存在高速缓存中
select确实没有锁。
我想问下,什么时候 要加/会加 共享锁呢?
e.g lock table name in share mode
这个得按需求来,比如,你的需求是"只允许其他的用户查询表中的行,但是不允许插入、更新或删除行",那么这个时候你就可以使用S锁
这个的粒度是表级别,以下几种情况为加上S锁:
① 在创建索引时,会缺省地加上S锁。7*24业务这条语句(等价于建索引)会使得所有DML都被阻塞
② SELECT ... FOR UPDATE
③ 还有你举的那个例子,是手工加上S锁