实时搜索: oracle为什么会锁表

oracle为什么会锁表

370条评论 5400人喜欢 1741次阅读 591人点赞
如对表按地区分为A,B,C,D等地区,现在往A分区插入数据时,是不是只锁定表的A分区,会锁定B分区吗? , 比如一次性导入Oracle数据库6万条数据,没有使用多线程的前提下,等所有数据全部插入数据库再提交事物,这样会影响数据库性能或者造成锁表的问题吗? , 据?

另外,比如有A进程已锁定一条记录,B进程也在请求锁定该记录。当A进程做完了更新,关闭了游标(但没提交),那是不是B进程就可以锁定该记录了,因为A还没提交,这时B读出的数据应该是A做更新之前的吗?如果B也做了更新,B先提交,A后提交。那这条记录最终是A更新的还是B更新的?

帮忙回答仔细点,我说...

oracle 死锁和锁等待的区别: 楼主您好
所谓的锁等待:就是一个事务a对一个数据表进行ddl或是dml操作时,系统就会对该表加上表级的排它锁,此时其他的事务对该表进行操作的时候会等待a提交或是回滚后,才可以继续b的操作

所谓的死锁:当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060
deadlock detected while waiting for resource

模拟锁等待:

两个事务a和b,分别创建t1,t2,并且初始化一条数据,

a 更改t1的数据,此时并不提交,这时候b更改相同的一列,此时b一直处于等待的状态

我们可以查询锁等待的内容:

wait_lock.sql

select
(select username from v$session where sid = a.sid) username,
a.sid,
(select serial# from v$session where sid = a.sid) serial#,
a.type,
a.id1,
a.id2,
a.lmode,
a.request,
a.block,
b.sid blocking_sid
from v$lock a,
( select * from v$lock
where request > 0
and type <> 'MR'
) b
where a.id1 = b.id1(+)
and a.id2 = b.id2(+)
and a.lmode > 0
and a.type <> 'MR'
order by username,a.sid,serial#,a.type

此时可以查询到锁等待的现象,最后一列不为空的就是等待的事件

此时我们可以跟a用户提示让其提交事务或是回滚,也可以直接杀死

alter system kill session 'sid,serial#';

保持现状不动,在a事务更改t2表此时在a事务会产生

SQL> update t1 set id=1000 where id=1;
update t1 set id=1000 where id=1
*
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁

此时oracle已经帮我解决了这个死锁问题

死锁的产生需要四个必须的条件:

1 ,mutual execution(互斥)资源不能被共享,只能由一个进程使用

2,hold and wait(请求并持续)已经得到资源的进程可以再次申请新的资源

3,no pre-emption(不可剥夺)已经分配的资源不能被相应的进程强制剥夺

4,circular wait(循环等待条件)系统中若干进程组成环路,该环路中的每个进程都在等待相邻进程正占用的资源

定位死锁:

系统级别的定位

Select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object)

Username死锁的用户,lockwait死锁的状态,status中active表示死锁,machine死锁所在的机器,program死锁来自于那个程序

语句级别的定位

Select sql_text from v$sql where hash_value in (select
sql_hash_value from v$session where sid in (select session_id from
v$locked_object));

进程级别的定位

Select s.username,l.object_id,l.session_id,s.serial#,l.oracle_usrename,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;

处理死锁的一般策略

1,鸵鸟算法忽略该问题

2,定位死锁并且恢复

3,仔细对资源进行动态分配,避免死锁

4,破坏死锁中的一个条件

如果oracle解决不了的死锁,我们需要定位到进程级别,找到对应的sid和serial#

alter system kill 'sid,serail#'

失败的话,找到对应的进程强制关闭

Select p.spid from v$session s, v$process p where s.sid=xx and s.paddr=p.addr

ps -ef | grep spid

kill -9 xx

查询oracle的死锁

lock.sql

SELECT bs.username "Blocking User", bs.username "DB User",
ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
bs.serial# "Serial#", bs.sql_address "address",
bs.sql_hash_value "Sql hash", bs.program "Blocking App",
ws.program "Waiting App", bs.machine "Blocking Machine",
ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
ws.osuser "Waiting OS User", bs.serial# "Serial#",
ws.serial# "WSerial#",
DECODE (wk.TYPE,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'USER Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL USER LOCK',
'DX', 'Distributed Xaction',
'CF', 'Control FILE',
'IS', 'Instance State',
'FS', 'FILE SET',
'IR', 'Instance Recovery',
'ST', 'Disk SPACE Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'LOG START OR Switch',
'RW', 'ROW Wait',
'SQ', 'Sequence Number',
'TE', 'Extend TABLE',
'TT', 'Temp TABLE',
wk.TYPE
) lock_type,
DECODE (hk.lmode,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (hk.lmode)
) mode_held,
DECODE (wk.request,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (wk.request)
) mode_requested,
TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
DECODE
(hk.BLOCK,
0, 'NOT Blocking', /**//* Not blocking any other processes */
1, 'Blocking', /**//* This lock blocks other processes */
2, 'Global', /**//* This lock is global, so we can't tell */
TO_CHAR (hk.BLOCK)
) blocking_others
FROM v$lock hk, v$session bs, v$lock wk, v$session ws
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.SID = bs.SID(+)
AND wk.SID = ws.SID(+)
AND (bs.username IS NOT NULL)
AND (bs.username <> 'SYSTEM')
AND (bs.username <> 'SYS')
ORDER BY 1;

这些语句的执行最好是在plsql或是sqldeveloper如果是直接在数据库里面执行的需要格式化表,否则会很让你眼花的。

ORACLE中多久后会自动解锁: 有可能多次密码输错被锁或帐号到期被锁了,不会自动解锁的。用sys进去解吧

对数据库分区表进行更新操作时,数据库会锁定全表,还是仅锁定对应分区呢: In order to provide partition independence for DDL and utility operations, Oracle supports DML partition locks. Partition independence allows you to perform DDL and utility operations on selected partitions without quiescing activity on other partitions.

批量导入数据会影响数据库性能或者锁表吗: 从你的描述来看,你是打算使用编程的方式进行导入,这种做法会严重影响数据库性能,原因有两方面:一是每条数据在插入的时候都要验证是否违反表中的约束条件;二是在一个集中的时间段里面出现了大量的IO操作。建议你使用Oracle自带的导入导出工具进行操作,不要自己写程序。你的这种方式中如果一条数据有问题,则6万条数据都会导入失败。

ORACLE数据库如何查看死锁: SELECT substr(v$lock.sid,1,4) "SID",
substr(username,1,12) "UserName",
substr(object_name,1,25) "ObjectName",
v$lock.type "LockType",
decode(rtrim(substr(lmode,1,4)),
'2','Row-S (SS)','3','Row-X (SX)',
'4','Share', '5','S/Row-X (SSX)',
'6','Exclusive', 'Other' ) "LockMode",
substr(v$session.program,1,25) "ProgramName"
FROM V$LOCK,SYS.DBA_OBJECTS,V$SESSION
WHERE (OBJECT_ID = v$lock.id1
AND v$lock.sid = v$session.sid
AND username IS NOT NULL
AND username NOT IN ('SYS','SYSTEM')
AND SERIAL# != 1);

oracle 提交之后 游标还需要关闭吗,具体看详细描述: 建议你网上搜下ORACLE 锁机制和回滚段相关的资料
如果你A进程已经锁定了某些行,这些行将自动获得一个锁,
任何除A进程意外的请求,将等待A事务的完成;
COMMIT是事务结束的标志;再你没有COMMIT之前,代表A事务还在执行。
B事务会继续等待A事务的完成。

oracle10G delete、insert和select同时进行会不会锁表?请高手指点!: select不会锁表 其他的dml加的是行级锁 数据不冲突是不会有问题的

如何定位Oracle数据库被锁阻塞会话的根源: 查看被锁的表:
select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from
v$process p,v$session a, v$locked_object b,all_objects c
where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id
解锁:
alter system kill session '146';(其中146为锁住的进程号)

  • iap是什么

    为什么慢跑比踢足球的要氧量大: 跑步是有氧运动,踢足球是无氧运动. 什么是有氧运动? “有氧运动”这个名词您可能知道。但您是否清楚哪些运动属于有氧运动?许多谈到健身锻炼的文章,大多会推荐人们选择走、慢跑、跑、骑自行车、爬山、爬楼梯、游泳、舞蹈、太极...

    779条评论 3974人喜欢 5932次阅读 491人点赞
  • otdr怎么设置几个点

    这是什么游戏: 图片上不是写了 欧陆风云4 ...

    214条评论 1097人喜欢 2727次阅读 824人点赞
  • gmc是什么车

    五岁孩子刚退烧可以喝麦冬瘦肉汤吗: 小孩不适合服用麦冬水,因为孩子的身体消化系统还没有完全发育成熟,所以建议小孩最好不要服用麦冬水。如果想要治疗小宝贝的消化系统问题,那么可以将白萝卜煮水服用,这样不仅效果好,同时也更加健康。大人日常想要令身体更加的健康...

    264条评论 5377人喜欢 2887次阅读 497人点赞
  • 希勒湖在哪

    linux下rpm安装mysql启动不了: setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组. 应该是权限的问题。。如果是rpm安装。。一定要先把/var/lib/mysql 这个文件删除。。...

    325条评论 4786人喜欢 4515次阅读 665人点赞
  • mg是什么单位

    我家孩子2岁了,发高烧39度多,医院开的退烧药吃了两次体温降到35.5度?: 退烧药说的严重点就只能在发烧是吃,如果不发烧了就别吃退烧药。 ...

    935条评论 3161人喜欢 1459次阅读 398人点赞
  • 昆山金鹰在哪里

    linux下安装mysql出错〔附错误日志〕: 目录不对,通常安装时,是把mysql安装文件复制到linux目录下(你的配置应该复制到 /usr/local/mysql),再执行上面的操作。 ...

    250条评论 4028人喜欢 2874次阅读 460人点赞