上午在看书的时候,突然想到可以对锁做一个小实验,实验如下:
实验环境:Windows 7 操作系统、ORACLE 11g
实验操作:打开一个sqlplus 窗口,一个PL/SQL Developer窗口,其中在sqlplus窗口对SCOOT 用户的BOOK表的B# = ‘2001232’的BLOAD列进行更新操作,将BLOAD从’是’改为’否’,但暂时不提交所作的修改,实验代码如下:
--先查询一下book表的状态
select * from book;
B# ISBN BLOAD BADD
-------------------- ------------- ----- --------------------------------------------------------------------------------
2001232 7040195836 否
1005050 9787506336239 是
1005063 9787508040110 否
3007071 9787010073750 是
20021213
--确认我们要更新的行,执行更新操作
SQL>Update book
SQL>Set bload = ‘否’
SQL>Where B#= ‘2001232’;
SQL>已更新一行
--更新成功,但此时还没有提交操作
--我们再在PL/SQL Developer执行查询操作,看是否能够查询,结果显示可以查询。
SQL>SELECT * FROM book;
--再在PL/SQL Developer窗口中执行同样的操作,代码如下
SQL>Update book
SQL>Set bload = ‘否’
SQL>Where B# = ‘2001232’;
--窗口显示操作一直处于执行状态,原因是因为两个窗口更新的是同一行的同一列,而前一个操作锁定了要进行更新的那一行,由于它还没有提交操作,所以加在那一行上面的锁还没有被释放,任何其他对该行的操作都将被禁止,但是可以查询,直到他提交了所做的更新,释放锁之后才行。
--下面我提交第一个更新操作
SQL>Update book
SQL>Set bload = ‘否’
SQL>Where B#= ‘2001232’;
已更新一行
SQL>commit;
提交完成
之后再看第二个更新操作的状态,已变为已更新一行
SQL>Update book
SQL>Set bload = ‘否’
SQL>Where B# = ‘2001232’;
1 row updated
扩展一下:我第二次更新还没有提交,我又在sqlplus窗口里执行第三次更新操作,还是同一行但是是不同的列,那么会不会得到同样的结果呢?
实验结果与上面一样,说明ORACLE在用户对某一张表上每个记录进行更新操作的时候,ORACLE将要更新的那一行加上了锁,也就是行锁,此行锁将阻止一切对该行的操作除了查询操作。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26500857/viewspace-719477/ ,如需转载,请注明出处,否则将追究法律责任。