13、oracle 锁

13、管理数据并发——锁

1、锁机制

高级数据并发处理

执行插入、更新和删除时使用行级锁定

查询不需要任何锁

自动队列管理

在事务处理(commit或rollback)结束之前一直持有锁

undo快记录快镜像 block before immage.

DML锁:exclusive(排他)

table lock表锁  row exclusive 行级锁

2、锁冲突

悲观锁、乐观锁

悲观锁: select * from a for update; 自动加锁(for update)

乐观锁:数据库服务器根据情况加锁

锁冲突原因:未提交更改、长时间运行事务。不必要的高级别锁(悲观锁)

v$lock

v$locked_object

dba_waiters

dba_blockers;

v$transaction;

3、解决锁冲突

update scott.emp set sal=sal+100 where EMPNO=‘7369‘;

提交事务或者kill session

(1)查询到死锁session

select sid,serial#,username from v$session where sid in (select blocking_session from v$session);

SQL> select sid,serial#,username from v$session where sid in (select blocking_session from

v$session);

SID    SERIAL# USERNAME

---------- ---------- ------------------------------

21    7 SYS

(2)kill session;

alter system kill session ‘21,7‘ immediate;

生产环境:

SQL>spool kill_session.sql

select ‘alter system kill session ‘‘‘||sid||‘,‘||serial#||‘‘‘;‘ from v$session where sid in (select blocking_session from v$session);

SQL>spool off

4、死锁

select sid,type,id1,id2,lmode,request,block from v$lock where type in (‘TM‘,‘TX‘) order by 1,2;

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in (‘TM‘,‘TX‘) orde

r by 1,2;

SID    TY     ID1  ID2  LMODE  REQUEST      BLOCK

---------- -- ---------- ---------- ---------- ---------- ----------

18     TM   73201  0       3 0        0

18     TX  393218      1952   0 6        0

148    TM   73201  0       3 0        0

148    TX  393218      1952   6 0        1

SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction where XIDSQN=1952;

XIDUSN    XIDSLOT  XIDSQN

---------- ---------- ----------

6        2        1952

sid表示会话ID,TM表示表级锁,TX表示行级锁,XIDSLOT表表示事务槽 ,ID2(1952)表示事务 ,XIDUSN表示回滚段 。

select trunc(393218/65535),mod(393218,65535) from dual;

SQL> select trunc(393218/65535),mod(393218,65535) from dual;

TRUNC(393218/65535) MOD(393218,65535)

------------------- -----------------

6    8

时间: 2024-10-16 23:14:26

13、oracle 锁的相关文章

【锁】Oracle锁系列

[锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 锁的概念.分类.及其模拟 ② 查询锁的视图及视图之间的关联 ③ 锁的参数(DML_LOCKS.DDL_LOCK_TIMEOUT) ④ FOR UPDATE及FOR UPDATE OF系列 ⑤ 带ONLINE和不带ONLINE创建索引的锁情况(是否阻塞DML操作) ⑥ 包或存过不能编译的解决方法

oracle 锁

问题如下: SQL> conn scott/[email protected]_databaseConnected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0Connected as scott ...... SQL> drop table student2; drop table student2 ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效================

oracle 锁表 及 解锁

很久没有写博客了.不知道写什么 今天,让我清一张表的数据,结果清了之后,系统直接不动了,就好像服务器挂死了一样. 后来找了半天才发现,原来是我删除数据之后没有提交事物造成了数据库锁表,然后又不明白了, 什么是锁表呢,于是就上网去查 查了半天,大多数都是说怎么解决锁表和查询锁表的,但是只了解方法还不够,又想知道原理,于是 就继续往深里查查到了oracle的锁机制 由于数据库是多用户同时使用的共享资源,当多个用户并发的存取事物的时候,数据库中就会发生多个进程 同时操作同一个数据的情况,若对并发操作不

Oracle锁表查询和解锁方法

数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remove DQL:数据库查询语言,关键字:select oracle表在什么情况下会被锁住 DML锁又可以分为,行锁.表锁.死锁 行锁:当事务执行数据库插入.更新.删除操作时,该事务自动获得操作表中操作行的排它锁. 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL

查询Oracle锁表和解决方法

Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count(*) from v$locked_object;select * from v$locked_object;(2)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_obj

Oracle锁总结

<oracle的锁> 在数据库中必须要了解的几点: 1.事务是数据库的核心,他们是好东西 2.应该延迟到适当的时刻才提交.不要太快提交,以避免对系统带来压力,这是因为,即使事务很长或很大,也一般不会对系统造成压力.相应的原则是:    在必要时才提交,不要提前.事务的大小只应该根据业务逻辑来定. 3.只要需要,就应该尽可能长时间的保持对数据所加的锁.这些锁是你能用的工具,而不是让你退避三舍,锁并不是什么稀有资源,恰恰相反,只要需要,    你就应该长期的保持数据上的锁.锁并不稀少,而且他们可以

oracle 锁的介绍 (转)

本文转自:http://blog.csdn.net/gyb2013/article/details/6929697 一.什么是锁: Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部.这个是通过ITL来实现的,一个事务要修改块中的数据,必须获得该块中的一个itl.关于itl(事务槽)的介绍可参考http://blog.csdn.net/gybyylx/article/details/6893639. 说明:在orac

Oracle锁表 行级锁 表级锁 行级锁

Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行          ----使用 commit 或 rollback 命令释放锁 ----Oracle 通过使用 INSERT.UPDATE 和 SELECT-FOR UPDATE 语句自动获取行级锁 SELECT-FOR UPDATE 子句  ―在表的一行或多行上放置排他锁  ―用于防止其他用户更新该行 ―可以执行除更新之外的其他操作 ―select * from goods whe

oracle锁表

Oracle锁表比较简单,查询锁表的session杀掉就可以了. 1.以下几个为相关表 SELECT * FROM V$LOCK; SELECT * FROM V$SQLAREA; SELECT * FROM V$SESSION; SELECT * FROM V$PROCESS; SELECT * FROM V$LOCKED_OBJECT; SELECT * FROM ALL_OBJECTS; SELECT * FROM V$SESSION_WAIT; 2.查看被锁的表 SELECT B.OWN