Oracle初学者笔记(四)-锁

王朝oracle·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

为什么要用锁:

多个用户同时对数据库进行操作的时候会产生冲突;锁可以防止多用户并行

的访问冲突;

//Sql-Plus的查看当前用户的命令:show user;

//Sql_Plus的修改提示符的命令:set sqlprompt ....>;

当另一个用户进行的操作还在缓冲区中,还没有commit的时候,

也就是另一个用户的事务没有结束的时候,本用户的对于同一个

资源的操作就会被挂起操作就会被阻塞;

这里所说的同一个资源叫做共享资源:

不仅指数据库行,而且也指其他的资源,如表;

当对同一资源进行操作的时候系统会自动加锁阻塞其中的

一个;但是当两个用户同时对一个表中的不同行进行操作的

时候,因为它们并没有同时对一个行资源进行更新,所以

系统并没有自动加锁来阻塞其中的一个用户;所以我们似乎可以

看到系统所认为应该自动加锁的资源是行,而不是表;那么如果

我们不想出现这种交叉修改的局面,是不是可以手动对整个表

进行加锁呢?

所以我们发现有两种类型的锁:

行级锁:tx

行被排他锁定;

在某行的锁被释放之前,其他用户不能修改此行;

使用commit或者rollback命令释放;

使用insert,update的时候自动被上锁;

用select ...for update语句获得行级锁:被加锁的对象是所有

被select 到的行;

防止其他用户修改此行,但可以查询;

具体的形式为:

如果锁定所有列:select..for update;

锁定特定列:select ..for update of ename;

不合理的是:当一个用户锁定时,别的用户不知道,只会等;

所以用select ..for update wait(second):

超过secong秒后加锁的用户还没有解锁的话,

其他等待也尝试加锁的的用户就会得到一个错误信息;

表级锁:tm

可以设置为三种模式:Lock table userID.tablename in [] mode;

共享:其他用户只能查询,不能更新,删除,插入;

多个用户可以同时对同一个表设置共享锁;

共享更新:in share update mode;

锁定要被更新的行,其他用户可以同时查询,

插入,更新未被锁定的行,即未被更新的行;

等于select..for update;

允许多个用户同时锁定表中不同的行;

排他:

仅允许其他用户查询,不允许插入,删除,更新;

在同时间仅允许一个用户在表上放置排他锁;

如果加上nowait的话,如果发现该表已经被锁定,

就不再等待,立即返回一个错误信息;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航