标签:
锁的概念锁有“只读锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁”(一次锁住一条记录),“页级锁”(一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁”(锁住整个表)。
若为“行级排它锁”,则除被锁住的行外,该表中其他行均可被其他的用户进行修改(Update)或删除(delete)。若为“表级排它锁”,则所有其他用户只能对该表进行查询(select)操作,而无法对其中的任何记录进行修改或删除。当程序对所做的修改进行提交(commit)或回滚(rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。
如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。
隐式锁和显式锁
在Oracle数据库中,修改数据操作时需要一个隐式的独占锁,以锁定修改的行,直到修改被提交或撤销为止。如果一个会话锁定了数据,那么第二个会话要想对数据进行修改,只能等到第一个会话对修改使用COMMIT命令进行提交或使用ROLLBACK命令进行回滚撤销后,才开始执行。因此应养成一个良好的习惯:执行修改操作后,要尽早地提交或撤销,以免影响其他会话对数据的修改。
对emp表的SCOTT雇员记录进行修改,测试隐式锁。 步骤1:启动第一个SQL*Plus,以SCOTT账户登录数据库(第一个会话),修改SCOTT记录,隐式加锁。 UPDATE emp SET sal=3500 where empno=7788; 步骤2:启动第二个SQL*Plus,以SCOTT账户登录数据库(第二个会话),进行记录修改操作。 UPDATE emp SET sal=4000 where empno=7788; 步骤3:对第一个会话进行解锁操作: COMMIT; 步骤4:查看第二个会话,此时有输出结果: 步骤5:提交第二个会话,防止长时间锁定。
表的显式锁定
锁定行
对emp表的部门10的雇员记录加显式锁,并测试。
对部门10加显式锁: SELECT empno,ename,job,sal FROM emp WHERE deptno=10 FOR UPDATE;
步骤1:对部门10加显式锁: SELECT empno,ename,job,sal FROM emp WHERE deptno=10 FOR UPDATE; 步骤2:启动第二个SQL*Plus(第二个会话),以SCOTT账户登录数据库,对部门10的雇员CLARK进行修改操作。 UPDATE emp SET sal=sal+100 where empno=7782; 步骤3:在第一个会话进行解锁操作: COMMIT; 步骤4:查看第二个会话,有输出结果:
锁定表
LOCK语句用于对整张表进行锁定。
对表的锁定可以是共享(SHARE)或独占(EXCLUSIVE)模式。共享模式下,其他会话可以加共享锁,但不能加独占锁。在独占模式下,其他会话不能加共享或独占锁。
【训练1】 对emp表添加独占锁。
步骤1:对emp表加独占锁:
LOCK TABLE emp IN EXCLUSIVE MODE;
步骤2:对表进行解锁操作:
COMMIT;
标签:
原文地址:http://blog.csdn.net/u010982856/article/details/46509361