JSP+SQL Server 2000的数据库写流水号的问题
要完成的一项工作是生成序列号并写入表A。
表A结构:ID(int,自动增长,主键) SerialNo:(int) ......
现在要做的是访问表A,插入一行数据,SerialNo必须等于ID号(ID是自动增长的),最后返回SerialNo号供其他操作使用
数据库SQL Server 2000 服务器:Tomcat 4.1.27
之前的做法是用一个select MAX(ID) from A来获取前一条记录,把前一记录的ID加一做为接下来要写入的那行数据的SerialNo然后写入数据。
访问的人少时没出问题,但访问的人多起来后就不清楚了。
(奇怪的要求,SerialNo和ID相同会造成数据冗余,但如果改动表我要改超多页面,没心思,都是之前那位程序员惹的祸)
想问两个问题:
1、能不能用一条SQL语句完成这个写操作?(serialNo与ID相同)
2、之前的做法是否会出问题?换句话说,jsp的执行会不会出现这种情况:a.jsp和b.jsp内容完全一样,但位于不同目录,当两个人分别访问a.jsp,b.jsp的时候(同时访问),会不会出现a.jsp中的select MAX(ID) from A得到了数据比如是25,此时a.jsp应该写入ID:(自动增长到26,)SerialNo:26,但如果insert操作还未执行之前,b.jsp的select和insert操作已经完成了(写入ID:26 SerialNo:26)?
这样的话a.jsp写入的记录其实是ID:27 SerialNo:26,造成了SerialNo的重复
也就是说a.jsp之前select得到的是“脏”数据?(用存储过程好像可以通过锁定数据库来避免这种情况,但是我不想用过程)我不清楚jsp的执行是否会出现这种情况!
我现在想把它改成用同一个JavaBean,范围是application,然后把select,insert,再select返回insert操作写入的SerialNo号这些操作写在一个方法里,把这个方法设为synchronized,不过总是没底,不知道能不能解决这个问题
谁有比较好的解决方法?类似这种又要select又要insert还要考虑并发的情况?
200分,up有分