关于数据库表记录主键生成的问题?

03-03-19 bluru2

在开发jsp/servlet的b/s系统,自然面临多线程问题,向表中插入记录时,有可能出现主键重复异常。大家是怎么处理的,谢谢

我的主键生成策略是取主键字段的最大值加1,然后插入记录,多用户并发插入记录,会出现问题吗?

geshe
2003-03-19 13:54

不同的数据库对自动增量有不同的支持。

Sqlserver和DB2有Identity类型。

Oracle有Sequence可以用,当然这个SQL写法就以上的有点不一样了。

Mysql有Auto_increment。

要么在类的层面上,用静态同步方法或对静态成态进行同步,使得多线程成为单线程(就是一个一个给我Save。:D)。这也是一种解决方法,因为创建自增数据一般不是业务的大部分需要。

Jevang
2003-03-20 03:46

max() + 1 won't work even with single user if you have multiple inserts within a transaction as you have not committed in the second call on max().

all RDBMS have its way, DB2 support both identity col and sequence. But if you want your app be DB independent, build your own auto number framework or buy one will benefit you in long run.

Gen seed on middle tier is also dangerous unless you have cluste wide sync mechanism.

wildfox
2003-03-20 11:37

可以考虑在某个位置记录该表中的最大主键,然后用一个同步的方法根据这个值产生新的主键,并把新产生的这个新的主键值作为最大主键,每次要插入记录之前,都先这样为这个记录产生主键。

manbaum
2003-03-24 17:18

> 不同的数据库对自动增量有不同的支持。

> Sqlserver和DB2有Identity类型。

> Oracle有Sequence可以用,当然这个SQL写法就以上的有点不?> 样了。

> Mysql有Auto_increment。

用系统自带的自增数据类型有个问题,就是如何获得自增后的值,不同的数据库实现有不同的方法。我用的办法是自己建一个表,记录最大值,用存储过程实现自增,注意在存储过程中实现自增时考虑锁记录,防止多线程同时增同一个数。