日期:2014-05-16  浏览次数:20816 次

数据库共享锁的问题
大家都知道select获得的是共享锁,许多用户可以同时查询相同的数据。
但是我有一个疑问!?

1.如果数据是从内存中获得那么共享锁可以说的通。

2.如果数据不在内存中,而要从磁盘读取??一个磁盘有多少个磁头?应该只有一个吧。

如果几个用户访问相同的数据,而这数据不在内存中。
问他们可以同时读取数据?这个时候共享锁该怎么解释呢?

------解决方案--------------------
据说select是没有锁的
------解决方案--------------------
2.如果数据不在内存中,而要从磁盘读取??一个磁盘有多少个磁头?应该只有一个吧
====================================================================
知道为什么磁盘称为块设备吗?那是因为磁盘上的数据你只能能寻址到块,磁盘上的数据是不能按字节寻址的,所以要操作任何数据,都必须将数据读入到内存中来,操作完了,再写回磁盘。所以所谓锁,是一个内存中数据结构。对数据块内容的操作(数据行的读写)都是在内存中进行的。所以锁应该是一个内存上的概念,和磁盘无关。
------解决方案--------------------
Oracle的select是没有锁的
你可以测试一下
打开一个cursor,然后查询v$lock.
------解决方案--------------------
引用:
引用:Oracle的select是没有锁的
你可以测试一下
打开一个cursor,然后查询v$lock.

select确实没有锁。
我想问下,什么时候 要加/会加 共享锁呢?
e.g lock table name in share mode


这个得按需求来,比如,你的需求是"只允许其他的用户查询表中的行,但是不允许插入、更新或删除行",那么这个时候你就可以使用S锁
这个的粒度是表级别,以下几种情况为加上S锁:
① 在创建索引时,会缺省地加上S锁。7*24业务这条语句(等价于建索引)会使得所有DML都被阻塞
② SELECT ... FOR UPDATE 
③ 还有你举的那个例子,是手工加上S锁