浅析oracle行级锁的特殊用法
Oracle有很多锁,各种锁的用途也不同,下面的重点是Oracle行级锁,Oracle行级锁仅锁定在用户访问的行中,可以更好地保证数据的安全性。如果用户正在修改一行,则其他用户可以在同一表中更新该行之外的数据。
Oracle行级锁是一种互斥锁,可以防止其他事务修改行,但不会阻止操作读取行。
在使用插入、更新、删除和选择……更新语句时,Oracle将自动应用Oracle行级锁级锁…UPDATE语句允许用户每次更新多行记录,这些记录将被锁定,并且只能由发起查询的用户编辑。只有在回滚或提交事务之后,锁才会被释放,其他用户可以编辑这些记录。
选择的语法…更新语句如下所示:
复制代码代码如下所示:
选择…更新column_list } { {等} { }跳过| NOWAIT锁;
其中:
子句用于指定要更新的列,即锁行上的特定列。
等待子句指定等待其他用户释放锁以防止无限等待的秒数。
使用更新等待子句的优点如下:
防止锁线无限期地等待;
允许对应用程序中的等待时间锁定进行更多的控制。
3对于交互式应用程序非常有用,因为这些用户不能等待不确定的应用程序。
4。如果使用跳过锁定,则可以越过锁定的行,而不报告由等待造成的繁忙资源异常报告。
实例:
复制代码代码如下所示:
创建表(一个VARCHAR2(20),B VARCHAR2(20));插入T值(T,V);(2),X和());
现在执行以下操作:
打开两个SQL窗口在PLSQL开发,
在1窗口中运行SQL
复制代码代码如下所示:
SELECT * FROM t在= '1'for更新;
运行在2窗口SQL1
复制代码代码如下所示:
1。SELECT * FROM t在= 1;
这不是问题,因为行级锁不会影响纯SELECT语句。
再次运行SQL2
复制代码代码如下所示:
2。SELECT * FROM t在= '1'for更新;
执行SQL时,该语句总是处于等待状态,除非SQL提交或回滚到窗口1中。
怎么能不等待SQL2或等待指定的时间我们再次为
三
复制代码代码如下所示:
SELECT * FROM t在= '1'for立即更新;
执行此SQL时,异常将直接报告给繁忙的资源。
如果执行
复制代码代码如下所示:
SELECT * FROM t在= '1'for更新等6;
等待6秒后,报告异常资源的异常情况。
如果我们执行sql4
四
复制代码代码如下所示:
SELECT * FROM t在= '1'for更新立即跳过洛克D;
执行SQL时,它不会等待,也不会报告繁忙的资源。
现在让我们看看如果我们执行以下操作将会发生什么。
在窗口1中执行:
SELECT * FROM t在行号3立即跳过锁定在窗口2执行:
SELECT * FROM t在行号6立即跳过锁定;
选择更新是这样的,插入、更新、删除是默认锁,选择和更新的原则和操作没有两个。
选择更新时,在包含在多个表中的子句中,具有较大的效果,如不使用列指定的表锁定,所有相关的表都被锁定,如果指定在需要修改列时,这些列只会在表中相关行被锁定。