广州明生堂生物科技有限公司


Oracle初学者笔记(四)-锁

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


编辑:广州明生堂生物科技有限公司

标签:用户,加锁,操作,就会,其他用户