scheduler job在数据库里的执行与事务关系测试

scheduler job在数据库里的执行与事务关系测试

创建几个测试用存储过程

create or replace procedure p_test is
begin
insert into test values(1,'test');
end p_test;
/

create or replace procedure p_test_update1 is
begin
update test set name='aa' where id=1;
end p_test_update1;
/


create or replace procedure p_test_update2 is
begin
update test set name='bb' where id=2;
end p_test_update2;
/

创建一个job用来定时执行上面3个存储过程
exec dbms_scheduler.create_job(job_name=>'p_test_dml',job_type=>'PLSQL_BLOCK',job_action=>'begin p_test;p_test_update1;p_test_update2;end;',start_date=>to_date('2019-12-23 09:45:15','yyyy-mm-dd hh24:mi:ss'),repeat_interval=>'freq=daily;interval=1');
exec dbms_scheduler.enable('p_test_dml');


启用job
exec dbms_scheduler.set_attribute('p_test_dml','job_action','begin p_test;p_test_update1;p_test_update2;end;');

logmnr解析日志如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
1、经过logmnr解析后发现,job执行会在后台开启一个会话,然后存储过程是按照顺序执行的。
2、上面job执行的3个存储过程,后台是在一个xid(事务)里的

另外实际测试发现,如果有2个定时任务时间上有交集,在后台跑的过程中会遇到阻塞类等待事件
第一个job,是update 200w行数据,比第二个job早执行1s

create or replace procedure p_test_update1 is
begin
update test set name='aa' where id<=2000000;
end p_test_update1;
/

在这里插入图片描述

第二个job是update 2w行数据,比第一个job晚执行1s

create or replace procedure p_test_update2 is
begin
update test set name='bb' where id<=20000;
end p_test_update2;
/

在这里插入图片描述

查看ash报告,可以发现,晚执行的第二个job会因为前面第1个 update 200W的事务没有执行完毕而阻塞。
在这里插入图片描述

总结:
1、多个job之间执行dml类job,时间要错开
2、rac环境job会在各个实例后台执行,按照job内存储过程顺序执行,并且在同一个事务里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值