欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-06 17:39:39
...

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解析日志如下:
scheduler job在数据库里的执行与事务关系测试
scheduler job在数据库里的执行与事务关系测试
scheduler job在数据库里的执行与事务关系测试

scheduler job在数据库里的执行与事务关系测试
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;
/

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

第二个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;
/

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

查看ash报告,可以发现,晚执行的第二个job会因为前面第1个 update 200W的事务没有执行完毕而阻塞。
scheduler job在数据库里的执行与事务关系测试

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

相关标签: 测试