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解析日志如下:
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内存储过程顺序执行,并且在同一个事务里
下一篇: 2011年Java技术展望