请问如何解决多线程下的自增字段的问题

kinetics 2003-06-22 05:54:11
在通过java程序对数据库做insert操作时,
需要对某字段按a001,a002进行自动增加
我现在的做法是取出当前最大值+1,
可是在多用户操作时可能同时取同一个值
有什么好的解决方法么?
谢谢
...全文
208 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wafer_w 2003-06-25
  • 打赏
  • 举报
回复
可以在数据库中加个表,里面只有2个字段,表名和值!
可以用到单例和工厂模式写一个生成主键的类,对这个表进行synchronized操作,每次要insert时利用这个类生成键!
--
同意
llhy 2003-06-25
  • 打赏
  • 举报
回复
最简单的方法是使用表的触发器
liliang_740705 2003-06-22
  • 打赏
  • 举报
回复
在数据库中有Sequence(序号)它由数据库自动增加,这是解决多用户操作时可能同时取同一个值一种好的解决方法。
在程序中可用Select语句读取。
feiyuegaoshan 2003-06-22
  • 打赏
  • 举报
回复
楼上对路!
Support!
amoslu 2003-06-22
  • 打赏
  • 举报
回复
程序只在一个虚拟机上用,可以在这个产生唯一代码的方法前面加上synchronized
跨虚拟的机的可以通过数据库实现代码的生成。或者采用ejb来生key
sobingman 2003-06-22
  • 打赏
  • 举报
回复
注相应SQL语句请用JDBC调用(这里简写了)
sobingman 2003-06-22
  • 打赏
  • 举报
回复
不一定要用synchronized。用数据库事务也可以,做成一个函数或一个存贮过程
begin transaction;
index = select key from keyTable;
index = index+1;
update KeyTable set key = index;
index = select key from keyTable;
end transaction;
return index;

为提高效率可以写成如下(应尽量用这个函数生成key,否则浪费编码空间):
int getIndex(){
static bIsFirst = false;
int currentIndex , maxIndex;
if(IsFirst || (currentIndex == maxIndex)){
begin transaction;
currentIndex = select key from keyTable;
maxIndex = currentIndex+100;//或其它缓冲值
update KeyTable set key = maxIndex;
maxIndex = select key from keyTable;
end transaction;
}//end if
return ++currentIndex;
}//end
lijing725 2003-06-22
  • 打赏
  • 举报
回复
可以在数据库中加个表,里面只有2个字段,表名和值!
可以用到单例和工厂模式写一个生成主键的类,对这个表进行synchronized操作,每次要insert时利用这个类生成键!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧