首先,for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改。
for update 和for update nowait主要区别在于是否等待,如果不加nowait,在执行select时就会报错,如果加了nowait,在执行select时就会等待,直至锁被释放。
首先我们使用两个sql:
1.select * from HH t where id='1' for update
2.select * from HH t where id ='1' for update nowait
sql1在pl/sql中执行,sql2在ob12中执行(在pl/sql或ob12中开两个窗口执行不行,现在我也不知道为什么):
执行sql1后查询出正确信息,在执行sql2,出现错误信息“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”。这是因为执行sql1时对改行的数据加了锁,其他操作是不能访问改行的。当我们在sql1后执行commit后,sql2就能显示正确的数据。
将sql2换成for update 按上面得步骤执行,sql2会一直等待锁得释放不会,直至sql1后commit,sql2就能查询出数据;
这里还有 for update wait n (n是时间,单位:秒),即会等待n秒,n秒之后数据还是锁住的话就会报上面提到的错误;
其实for update 就是为了防止在查询数据的时候对数据进行修改,比如有以下两个sql:
sql1:select * from HH t where id='1' for update
sql2:update HH set name='张三' where id = '1'
当我们执行sql1后,在执行sql2,sql2就会一直等待sql1将锁释放后才能执行,这样在查询的时候就不会出行数据改变,在sql1后执行commit,sql2就会自动执行了。
相关文章
- Java中vector的使用详解、enumeration枚举接口的和iterator的区别、vector与list的对比
- Thread使用总结(1)——Runnable和Thread的区别是啥
- SQL中UNION ALL 和UNION的区别及使用
- Python杂谈: 集合中union和update的区别(Python3.x)
- 更符合python的方式来编写这个块(和elimnate: ValueError: dictionary update sequence element #0的长度为1;2是必需的)
- 新手笔记(2) Servlet使用sendRedirect()方法和forward()方法重定向的区别
- 【html】使用img标签和背景图片之间的区别
- 前端HTML标签图像的属性和使用/图像img与背景background的区别
- for update 和 for update nowait 的区别
- PaperTrail不适合使用Carrierwave和“remove_previously_stored_after_update”选项。