按,这贴我已在oracle开发论坛发表。我在这再发表一下。
管理和开发本是一家的嘛,相辅相成的,这里的大侠也帮我想想。
附原贴:
昨天项目组的弟兄报了一个错误,困惑,不爽。盼大侠们指点。
现场:用户在java前台程序,点按钮,通过jdbc连oracle,再调用procedure。希望先将统计表的记录全删,再生成大致300多条记录。因为执行速度慢,多点几次按钮,结果生成了将近700条记录,翻倍了。
背景:使用的是IBM的连接池;自开发的线程oracle connection管理器,从池中取得连接和释放连接。默认的连接应该是自动提交的吧?!统计表是没主键约束的。procedure的类似代码如下:
create table audit_test(id number not null, description varchar2(10));
create or replace procedure audit_cqxw(p_action in varchar2) is
begin
delete audit_test
where description = 'audit';
for v_count in 1..20000 loop
insert into audit_test
values(v_count, 'audit');
end loop;
commit;
end audit_cqxw;
我做了8,9次前台程序调procedure的测试,发现真有一次表中有60000条记录,其余是对的20000条记录。为什么会这样,郁闷^_^
希望指点:
1,从纯oracle角度看,几乎瞬间多次执行,是否可能会出现上述情况?
2,大侠们在开发时是否碰到上述问题,是不是oracle的class12.zip的bug,或者IBM的数据库连接池的bug,是如何解决的?
抱拳,谢了!
最初由 Jervis 发布
[B]
create table audit_test(id number not null, description varchar2(10));
create or replace procedure audit_cqxw(p_action in varchar2) is
begin
delete audit_test
where description = 'audit';
commit;----这回可以确保多次执行不会出现产生6000行的数据错误[/COLOR]
for v_count in 1..20000 loop
insert into audit_test
values(v_count, 'audit');
end loop;
commit;
end audit_cqxw;
[/B]