
首先你要知道表锁住了是不是正常锁?因为任何DML语句都会对表加锁。
你要先查一下是那个会话那个sql锁住了表,有可能这是正常业务需求,不建议随便KILL session,如果这个锁表是正常业务你把session kill掉了会影响业务的。
建议先查原因再做决定。
(1)锁表查询的代码有以下的形式:
select count() from v$locked_object;
select from v$locked_object;
(2)查看哪个表被锁
select bowner,bobject_name,asession_id,alocked_mode from v$locked_object a,dba_objects b where bobject_id = aobject_id;
(3)查看是哪个session引起的
select busername,bsid,bserial#,logon_time from v$locked_object a,v$session b where asession_id = bsid order by blogon_time;
(4)查看是哪个sql引起的
select busername,bsid,bserial#,c from v$locked_object a,v$session b,v$sql c where asession_id = bsid
and bSQL_ID = csql_id and csql_id = ''
order by blogon_time;
(5)杀掉对应进程
执行命令:alter system kill session'1025,41';
其中1025为sid,41为serial#
一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL *** 作。发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。
erp100com
ORACLE数据库是现今数据库领域应用最广泛的 同时它也是一个庞大的系统 全面了解它 玩转它不但需要一定的理论知识 更需要开发经验与工程经验 本人是ORACLE一爱好者 以下是本人对ORACLE锁的一些经验 希望能与大家共同分享 预备知识 DDL(DATABASE DEFINITION LANGUAGE) 数据库定义语言 如create table drop table DML(DATABASE MODIFICATION LANGUAGE):数据库修改语言 如insert delete update 参考资料 Oracle Administrator s Guide Release Oracle Tuning Release ORACLE锁具体分为以下几类 按用户与系统划分 可以分为自动锁与显示锁自动锁 当进行一项数据库 *** 作时 缺省情况下 系统自动为此数据库 *** 作获得所有有必要的锁 显示锁 某些情况下 需要用户显示的锁定数据库 *** 作要用到的数据 才能使数据库 *** 作执行得更好 显示锁是用户为数据库对象设定的 按锁级别划分 可分为共享锁与排它锁共享锁 共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁 共享锁为事务提供高并发性 但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失 排它锁 事务设置排它锁后 该事务单独获得此资源 另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁 按 *** 作划分 可分为DML锁 DDL锁+DML锁又可以分为 行锁 表锁 死锁 行锁 当事务执行数据库插入 更新 删除 *** 作时 该事务自动获得 *** 作表中 *** 作行的排它锁 表级锁 当事务获得行锁后 此事务也将自动获得该行的表锁(共享锁) 以防止其它事务进行DDL语句影响记录行的更新 事务也可以在进行过程中获得共享锁或排它锁 只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时 事务才会获得表上的排它锁 也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档) 死锁 当两个事务需要一组有冲突的锁 而不能将事务继续下去的话 就出现死锁 如事务 在表A行记录# 中有一排它锁 并等待事务 在表A中记录# 中排它锁的释放 而事务 在表A记录行# 中有一排它锁 并等待事务; 在表A中记录# 中排它锁的释放 事务 与事务 彼此等待 因此就造成了死锁 死锁一般是因拙劣的事务设计而产生 死锁只能使用SQL下:alter system kill session sid serial# 或者使用相关 *** 作系统kill进程的命令 如UNIX下kill sid 或者使用其它工具杀掉死锁进程 +DDL锁又可以分为 排它DDL锁 共享DDL锁 分析锁 排它DDL锁 创建 修改 删除一个数据库对象的DDL语句获得 *** 作对象的 排它锁 如使用alter table语句时 为了维护数据的完成性 一致性 合法性 该事务获得一排它DDL锁 共享DDL锁 需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁 如创建一个包 该包中的过程与函数引用了不同的数据库表 当编译此包时 该事务就获得了引用表的共享DDL锁 分析锁 ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序 使运行相同语句的应用速度更快 一个在共享池中缓存的对象获得它所引用数据库对象的分析锁 分析锁是一种独特的DDL锁类型 ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系 当一个事务修改或删除了共享池持有分析锁的数据库对象时 ORACLE使共享池中的对象作废 下次在引用这条SQL/PLSQL语句时 ORACLE重新分析编译此语句 内部闩锁内部闩锁 这是ORACLE中的一种特殊锁 用于顺序访问内部系统结构 当事务需向缓冲区写入信息时 为了使用此块内存区域 ORACLE首先必须取得这块内存区域的闩锁 才能向此块内存写入信息 以上是 本人对ORACLE锁的一些总结 不足之处还望大家海涵 同时也希望大家多提出自己对ORACLE锁的一些看法 lishixinzhi/Article/program/Oracle/201311/16769
oracle数据库的表什么情况下会被锁住
DML锁又可以分为,行锁、表锁、死锁
-行锁:当事务执行数据库插入、更新、删除 *** 作时,该事务自动获得 *** 作表中 *** 作行的排它锁。
-表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。
-死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。
可以用乐观锁,在表上面加个字段rowversion,假如初值是1
当一个用户去更新表时,
1)先获取这个字段的值1
2)然后更新数据,rowversion+1,
3)提交时,先判断rowversion是否等于1,
如果不等于,说明有别的用户已经更改过该行数据了。就从1)开始在做一遍。
如果等于,就提交(此时rowversion=2)
你可以查查乐观锁的相关知识。
半专业回答:
1, 这是个疑问句吗
2,如果只是 读 *** 作是不会加锁的
3,事务2 什么 *** 作都不行
4,事务2 可以加共享锁,不能加排他锁
问题补充回答
读 *** 作就是select ,任何时刻都可以,因为是非阻塞读,由UNDO机制实现
共享锁是保证表结构不能被更改,但是可以更改没有加排他锁的数据
共享锁是表级的,排他锁是行级的
ConnectOracle con = new ConnectOracle();
Connection connect = congetConnection();
// 设置手动提交事务
connectsetAutoCommit(false);
Statement stmt = connectcreateStatement();
// 锁表
stmtaddBatch("lock table t_symbol_code_fee in exclusive mode");
// 此处打上断点后,执行另一个类,你会发现,执行成功后并没有更改记录,因为表已经被锁定。只有提交事务后,TestOracle中执行的修改才能生效。
stmtexecuteBatch();
// 提交后自动解锁,回滚时也会自动解锁
connectcommit();
stmtclose();
connectclose();
以上就是关于oracle数据库锁表怎么解决全部的内容,包括:oracle数据库锁表怎么解决、oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些、ORACLE 锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)