事务控制的问题

[复制链接]
查看11 | 回复4 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
按,这贴我已在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,是如何解决的?
抱拳,谢了!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 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]

回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
如果是因为多点了几次按扭……这个你就应该从业务的角度通过程序设计来保证了
如果点一下按扭就出这个情况,那应该是 java -----connectionpool 看哪里有什么问题
数据库本身不会自动执行多次的
另:楼上的这个提交并不能保证什么
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
可以通过页面的Session和一个值(比如HTML 的Form)来控制,通过这个Session和值可以判断是不是同一次用户请求,若是,过滤后面的执行。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
若是Java App就更简单了,只需控制Button,只有上次执行完并返回结果后才可以再次点击。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行