数据库表被锁死的原因

willwl 2009-05-18 10:12:58
数据库的用户表空间不足,用户表空间不是会自动增加么,那么往这个表空间上的表插入大量数据,这些表会被锁住么?
数据库两个Job,定为同时进行,大概同时对一张表进行写操作,会出现此表被锁么?
(数据库的Job执行失败,有异常(异常未处理的话),那这个Job下次执行会是什么时候,会再次执行先前那个时间的JOB么?)
另外如果应用程序连接数据库和JOB同时对一张表写操作,会导致死锁么,如果会的话,那要怎么避免
如果以上情况不足以导致表被锁住(都快一天了,手动执行这个procedure只需要10分钟,不会锁表这么长时间),
那么谁知道表被锁的所有可能原因(不可能导致死锁的,即自己没有遇到过的,请不要列出,以免混淆视听,谢谢)

请高人指点,分不够再加,回答问题之一正确的或指出有回答错误的(滥竽充数的),一律给分
...全文
4873 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
patonwang 2010-04-18
  • 打赏
  • 举报
回复
碰到同样问题
oraclelogan 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 willwl 的帖子:]
数据库的用户表空间不足,用户表空间不是会自动增加么,那么往这个表空间上的表插入大量数据,这些表会被锁住么?
数据库两个Job,定为同时进行,大概同时对一张表进行写操作,会出现此表被锁么?
(数据库的Job执行失败,有异常(异常未处理的话),那这个Job下次执行会是什么时候,会再次执行先前那个时间的JOB么?)
另外如果应用程序连接数据库和JOB同时对一张表写操作,会导致死锁么,如果会的话,那要怎么避免
如果以…
[/Quote]

1,除了以上几位的看法,我觉得还有一种可能就是:表空自增的大小<一次批量导入数据所占据的容量,比方说,表空间一次增长500M,但是你一次批量导入的数据占据空间600M,那么就有可能出现楼主描述的问题。

2,楼主最好把alert日志信息贴下,大家帮你分析下。
hotyxm 2009-05-19
  • 打赏
  • 举报
回复
1.user表空间会自动增加
2.job同时执行会表锁
3.job出现异常,下次如何执行取决于你的程序额
4. 应用程序与job对一张表操作,会导致死锁,
避免的方法是事务控制。


检查死锁

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;
vc555 2009-05-19
  • 打赏
  • 举报
回复
1.数据库两个Job,定为同时进行,大概同时对一张表进行写操作,会出现此表被锁么?

有dml,表上当然有锁。表上是3级tm锁。



2.(数据库的Job执行失败,有异常(异常未处理的话),那这个Job下次执行会是什么时候,会再次执行先前那个时间的JOB么?)

一个job到点执行失败,重新执行间隔为interval值,重试16次后停止。



3.另外如果应用程序连接数据库和JOB同时对一张表写操作,会导致死锁么,如果会的话,那要怎么避免

要看你具体操作内容,死锁出现的时候也就是结束的时候。看你的描述,只是有等待而已。
解决方式是从业务逻辑入手。
moqingcn 2009-05-19
  • 打赏
  • 举报
回复
加锁和死锁不同概念
willwl 2009-05-19
  • 打赏
  • 举报
回复
ls说的很有道理,不过现场库连不上了,后来发现现场的Users表空间文件不是自动增长的,
只有6G,后来改成8G,并设置成可自动增长的

重启数据库后,JOB继续上次没有成功的时间,执行成功了,但之后第二天再次执行到一半就把表锁住不走了
两次数据库都down掉了,会有影响么

另外我刚试了下,同时启动两个相同JOB不会造成死锁,操作也是交互的,一个JOB的操作总是等待另一个JOB执行完对那张表操作后,就继续了,只是一个JOB还是会延迟一段时间。

还有个问题,EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS(),这个JOB会影响我的JOB操作么
mrdavidtian 2009-05-18
  • 打赏
  • 举报
回复
Oracle锁表



Oracle锁表
行级锁
表级锁
行级锁
---- 行被排他锁定
----在某行的锁被释放之前,其他用户不能修改此行
----使用 commit 或 rollback 命令释放锁
----Oracle 通过使用 INSERT、UPDATE 和 SELECT…FOR UPDATE 语句自动获取行级锁
SELECT…FOR UPDATE 子句
―在表的一行或多行上放置排他锁
―用于防止其他用户更新该行
―可以执行除更新之外的其他操作
―select * from goods where gid=1001
―for update of gname;
―只有该用户提交事务,其他用户才能够更新gname

FOR UPDATE WAIT 子句
―Oracle9i 中的新增功能
―防止无限期地等待锁定的行
―等待间隔必须指定为数值文字
―等待间隔不能是表达式、赋值变量或 PL/SQL
变量
―select * from goods where gid=1001 for update of gname wait 3
―等待用户释放更新锁的时间为3秒,否则超时。
•表级锁
―保护表的数据
―在多个用户同时访问数据时确保数据的完整性
―可以设置为三种模式:共享、共享更新和 排他
语法:lock table<table_name>in<mode>;
共享锁
―锁定表
―仅允许其他用户执行查询操作
―不能插入、更新和删除
―多个用户可以同时在同一表中放置此锁
―lock table table_name
―in share mode [nowait];
― rollback 和commit 命令释放锁
― nowait 关键字告诉其他用户不用等待
共享更新锁
―锁定要被更新的行
―允许其他用户同时查询、插入、更新未被锁定的行
―在 SELECT 语句中使用“FOR UPDATE”子句,可以强制使用共享更新锁
―允许多个用户同时锁定表的不同行
加锁的两种方法
lock table tab_name in share update mode;
select column1,column2
from goods
where goods
where gid=1001
for update of column1,column2
排他锁
―与其他两种锁相比,排他锁是限制性最强的表锁
―仅允许其他用户查询数据
―不允许执行插入、删除和更新操作
―在同一时间仅允许一位用户在表上放置排他锁
―共享锁与此相反

lock table tab_name in exclusive mode;
lock table<表名>[<表名>]...
in share mode [nowait]

lock table< 表名>[<表名>]...
in exclusive mode [nowait]
lock table<表名>[<表名>]...
in share update mode[nowait]


mrdavidtian 2009-05-18
  • 打赏
  • 举报
回复
表锁死的原回很多啊,如果你是和别人共同使用一个数据库,在别人对某一条记录执行了DML语句而没有COMMIT时,你若想修改|删除时,这个表对你来说就被锁了.
willwl 2009-05-18
  • 打赏
  • 举报
回复
dba用户,用的Oracle默认的Users表空间,是自动增长的
doer_ljy 2009-05-18
  • 打赏
  • 举报
回复
会啊!为了防止脏读和脏写,可能出现锁冲突。
另外,表空间是不是自增的,要看你的表空间怎么定义的,也要看执行的用户又没有这个权限。
wffffc 2009-05-18
  • 打赏
  • 举报
回复
表空间是不是自动增长的,要看你建表空间的时候如何指定的.一般插入不会锁表

先确定一下你的表空间是不是自动增长的:
wf@ORA10> select dbms_metadata.get_ddl('TABLESPACE','USERS') from dual;

DBMS_METADATA.GET_DDL('TABLESPACE','USERS')
-------------------------------------------------------------------------

CREATE TABLESPACE "USERS" DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10\USERS01.DBF' SIZE 5242880
AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
ALTER DATABASE DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10\USERS01.DBF' RESIZE 10485760

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧