你好 请问oracle(10g) 执行定时任务job 锁表吗 锁的话怎么能够执行任务的同时还不影响正常的插入等操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你好 请问oracle(10g) 执行定时任务job 锁表吗 锁的话怎么能够执行任务的同时还不影响正常的插入等操作相关的知识,希望对你有一定的参考价值。

主要是想完成一个订单的自动处理 目前是有一张预订表 和 一张确认表 是这么想的,在每天的12点和18点 进行处理 把预定表中预定记录导入确认表中 并把相应的记录删除或者修改状态 在处理的时候 仍然可能有新的订单记录插入到预定表中 请问怎么处理 思路也可以

首先你需要了解一下什么是oracle的锁定?
在数据库中由于并发操作(多个用户对同样的数据做修改,比如insert,delete,update),需要锁来保持数据的完整性。一个时间只能有一个用户对这个数据做修改操作。这就是锁的成因。也就是说,因为并发,所以有锁。
在oracle数据库中,它并不会对某个表或者某几行加上锁,锁是以数据块的形式存在的。也就是说,每个数据块本身就存储着自己数据块中数据的信息,
这个地方就是ITL(inserted Transaction List),凡是在这个数据块上有活动的事务,它 的信息就会记录在这里面供后续的操作查询,以保证事务的一致性。
如何查看锁定:
select sid,type,id1,id2,lmode,request,block from v$lock;
当看到有block = 1的值表明该会话正在阻塞其他会话,Lmode表示当前会话正在持有的锁,而request表示会话等待另外一个会话要释放的锁。
一般记住LMODE=3 和6就可以了,3是共享锁,不会导致阻塞,6是独占锁会导致阻塞。

Lmode=3的锁是TM锁,就是表锁,它是一个段级的共享锁,每个用户都会以共享 的方式来持有它,它允许同级别或者低级别的锁同时设置,但是拒绝高级别锁的请求。比如DDL需要一个更高级别的排他表级锁。也就是说当表被加了TM锁定,就不能再对表做ddl操作来改变表的结构了。

Lmode=6的锁是TX锁,就是加在数据行上的一个排它锁,真正的目的在于维持事务的完整性,并不是加在某一行或者某几行上的锁。
另外TX锁并非是在对数据修改的时候才会发生,只要需要维护事务一致性的时候都需要TX锁。比如说分布式事务,一般来说通过db link在几个数据库中处理数据,因为是分布式的操作方式,所以需要一个事务的总协调者,这时候即使都是读取操作也需要一个TX锁来维护事务的一致性。

job的执行时间是12点和18点,执行的时候我们只管锁的情况,
第一步: insert into 确认表 select * from 预定表 where 预定条件 这时候确认表被锁定,无法执行修改操作
第二步: delete from 预订表 where 预定条件 这时候预定表被锁定,无法插入数据

考虑到第一步没有并发的操作,忽略它,也就是第二步删除的时候可能同时有新的数据要进来,那么新的数据只能等待删除操作完成了。如果数据量不大的话,等删除操作结束就好了,没什么问题。如果删除的数据很大,而且生产情况对新的数据要求时间很苛刻的话,可以考虑批量删除。比如10000条提交一次事务。或者在生产不是很忙的时间执行删除操作也可以。追问

那第二步不做删除 改成更新操作 把第一步里面预定 表中选出的数据的一个字段更改

追答

这样你还需要了解什么是DML操作,比如insert,delete,update都属于DML操作,都是要记录redo的,那么在对表执行DML操作的时候都是要加上TM和TX锁的,所以无论是delete或者update都一样。
另外update期间产生的redo会比delete多,因为在事务开始的时候,为了保护实例的崩溃恢复,都是要记录修改信息到redo日志的,用于一旦数据库崩溃的恢复(先前滚,再回滚)。相比delete而言,update不仅要记录更新之前的表中的那部分信息,还要记录更新过后的信息,而delete只记录删除之前的表的那部分的信息就可以,所以update对性能的影响要比delete大些。执行的时间也会相对来说长些。
我还是保留前面回答的看法:如果数据量不大的话,直接update,没什么问题。如果太大了,就要考虑在系统比较空闲的时候执行了,或者是批量的执行更新。

参考技术A 1、对于你的目标表,需要一个跟时间有关、或者序列插入的递增字段
2、当你的任务执行的时候
a、如果有时间有关的字段,则利用时间字段进行想用的操作,只操作job运行时表中存在的数据。
b、如果利用序列递增字段,则在job运行时,先检索表中最大的值,然后job操作的记录全部为 <= 检索值的表数据。追问

那锁表的问题怎么解决呢 给个QQ什么的吧 详细咨询下 谢谢

本回答被提问者采纳
参考技术B 锁表并不是全锁哦,只是对你要删除或修改的数据锁定。所以没有问题,只要资源不紧张,一般不会出现等待问题,注意SQL的效率问题。

以上是关于你好 请问oracle(10g) 执行定时任务job 锁表吗 锁的话怎么能够执行任务的同时还不影响正常的插入等操作的主要内容,如果未能解决你的问题,请参考以下文章

Oracle定时执行计划任务

Oracle定时任务-DBMS_SCHEDULER

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

转oracle定制定时执行任务

Quartz定时任务学习简单任务

你好,请问在Linux下,如何用浏览器来启动本地应用程序?