oracle行锁 select for update
来源:互联网 发布:朱生豪 莎士比亚 知乎 编辑:程序博客网 时间:2024/06/17 04:12
如果两个人同时查询到了一条数据,第二个的修改就会造成第一个人获取失效。为了避免这种情况的发生,我们使用了select for update对获取到的行进行了加锁。下面简单介绍一下select for update的使用方法。
先说明一下会用到的名词概念:
statement:一个SQL语句。
session:一个由ORACLE用户产生的连接,一个用户能产生多个SESSION ,但相互之间是独立的。
transaction:所有的改动都能划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sqlstatement 得到的数据都是以sql statement开始的IMAGE。
用法介绍:
update,insert ,delete, select ... for update会LOCK相应的ROW 。
只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会师释放。
简单举例:
transactionA下面
select* from connector a where a.MOBILE='13937134399' for updata
如上,这个将会对查询出来的行加上一个行锁,如果在
transactionB下面对这一行数据进行增删改都将会等待,普通的查询可以,使用 select for update 查询也需要等待。
需要在transactionA下面执行需要的操作之后commit或者rollback之后,在其他transaction 下面才可以对此表此行进行操作。
使用这个行锁的情况一般是对并发的情况要求比较高的时候,需要锁住某行进行一些更新语句之后进行释放,再让其他transaction去操作。在这次外呼系统中很好的利用了这点解决了并发的问题。
forupdate 后面还可以跟着[OF cols] [NOWAIT]
of的使用主要是针对多表关联的时候,如果不使用of,对两个表涉及到的行都将锁住,使用of可以指定锁定哪个表,
例如:selecta.MOBILE,b.NAME from connector a,student b
wherea.STU_ID=b.ID and a.MOBILE='13937134399' for updata of a.MOBILE
这样的话student表中对应的行是不加锁的,对connector一个表中行加锁
不使用两个表都加锁。
[NOWAIT]的使用是当锁冲突的时候提示的情况:
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054:resource busy and acquire with NOWAIT specified" ,如果不使用就会一直等待,直到锁释放之后执行。
在页面上调试的时候由于异常处理不好,把数据锁住了没有提交,也没有rollback,遇到这样的情况的时候可以通过以下方式解决:
-----查看被锁对象的序列号、sid
SELECTo.owner,o.object_name,o.object_type,s.sid,s.serial#
FROMv$locked_object l,dba_objects o,v$session s
WHEREl.object_id=o.object_id
ANDl.session_id=s.sid
ORDERBY o.object_id,xidusn DESC
/
------利用sid和序列号删除
altersystem kill session '243,10265';
243是sid10265是序列号
所以在使用锁的时候一定要做好页面的异常控制,不然很容易出问题。
*******************************************************
数据库中锁类型的介绍:
有两种基本的锁类型,排它锁(ExclusiveLocks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
其中DML锁(datalocks,数据锁),用于保护数据的完整性
DML锁的目的在于保证并发情况下的数据完整性,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
先说明一下会用到的名词概念:
statement:
session:
transaction:所有的改动都能划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sql
用法介绍:
update,
只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会师释放。
简单举例:
transaction
select
如上,这个将会对查询出来的行加上一个行锁,如果在
transaction
需要在transaction
使用这个行锁的情况一般是对并发的情况要求比较高的时候,需要锁住某行进行一些更新语句之后进行释放,再让其他transaction
for
of
例如:select
where
这样的话student表中对应的行是不加锁的,对connector一个表中行加锁
不使用两个表都加锁。
[NOWAIT]的使用是当锁冲突的时候提示的情况:
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054:
在页面上调试的时候由于异常处理不好,把数据锁住了没有提交,也没有rollback,遇到这样的情况的时候可以通过以下方式解决:
-----查看被锁对象的序列号、sid
SELECT
FROM
WHERE
AND
ORDER
/
------利用sid
alter
243是sid
所以在使用锁的时候一定要做好页面的异常控制,不然很容易出问题。
*******************************************************
数据库中锁类型的介绍:
有两种基本的锁类型,排它锁(Exclusive
其中DML锁(data
DML锁的目的在于保证并发情况下的数据完整性,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
0 0
- oracle行锁 select for update
- oracle行锁 select for update
- oracle行锁 select for update
- oracle select ... for update
- Oracle的select for update
- oracle的select for update
- Oracle中的select for update
- Oracle中的select for update
- Oracle Select...for update作用
- 浅谈Oracle select for update
- select for update行锁
- select for update行锁
- oracle-select for update nowait 与 select for update 差别
- Oracle中select ... for update的用法
- 【Oracle】从select for update开始
- oracle 锁住select查询结果for update
- Oracle For Update 行锁
- select ... for update, select ... for update nowait
- dump文件分析
- 【C++】错误 164 error C4996: 'std::_Fill_n':
- java synchronized互斥锁使用
- Cannot find any registered HttpDestinationFactory from the Bus.
- 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
- oracle行锁 select for update
- lintcode 两数组的交
- 父子进程对静态变量的操作不会相互影响
- 易错题总结2
- 【框架-MFC】CToolTipCtrl 换行显示
- Caffe学习系列(5):其它常用层及参数
- 为什么说Singleton 模式现在成为了反模式(Anti-Pattern)?
- 数据库版本管理工具Flyway——基础篇
- Filter注解方式实现拦截