在插入结果前重新生成MAX好了!~
解决方案 »
- oracle存储过程如何动态修改表名关联查询
- 求助:如何用应用程序监视数据库中某一表,当表中内容发生变化时将最新内容显示给用户,急...
- 关于函数count的一个问题?
- 请问大家一条SQL
- Ora9i 中的Oracle Directory Manager打开后连接不了,提示服务器未启动
- 弱弱的问:ora92从dba登陆进去后的界面里,怎么可以看到表里的字段说明?
- declare的问题!
- 100分大派送啊,一个DELETE SQL语句的小问题!
- int型在oracle要定义成什么啊(在线等,急)
- SQLDeveloper启动后一直在“等待编辑器初始化”
- 数据丢失了(急)
- 初学oracle问题:有关for循环
查询时加(加了没用呀,查询出max时锁就释放了)?录入本来就有锁关注!
然后每次需要插入一个id的时候,可以先去表A查询当前最大的max值并锁住这个最大值
ex: select maxid from A where type = xxx for update nowait ;
取得maxid 然后 maxid + 1 作为新的id 插入,同时更新表A中对应的maxid,最后一起提交如果并发操作的时候,先到达的请求会获得资源,插入数据;后到达的资源会因为所申请的资源被锁而获得一个资源正忙,请过会儿再申请的错误
这个有点相当于MySQL的自增长方式create sequence RequestID
increment by 1
start with 1
nocache;insert into A (ID, ...) values (RequestID.NextVal,...);这样不会受并发的影响.
而,使用序列插入的时候,如果意外导致插入失败,当前表中的最大id 为5,而下一个插入的id 就不是6,而是7了(因为曾经插入失败,序列值已经自动加1)
所以考虑了一下,序列好像不能够满足楼主的要求
如果加锁了,查询不到结果的,返回个资源正忙,请过会儿再申请的错误
select id into intoid from tablename
where id=
(
select max(id) from tablename
) for update;
insert into tablename(id) values(intoid +1);