Oracle的锁
为什么要用锁:
多个用户同时对数据库进行操作的时候会产生冲突;锁可以防止多用户并行
的访问冲突;
//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的话,如果发现该表已经被锁定,
就不再等待,立即返回一个错误信息;