今天发现了一个很奇怪的问题,在oracle的一张表里面有两个字段id,wrttime
这id字段从应用程序中每次SELECT MAX(ID) FROM 表名 然后+1插入到表中,wrttime字段每次插入时获取系统时间,
今天我在发现有这么几条记录
1 887255 2008-11-3 10:24:43
2 887257 2008-11-3 10:24:57
3 887259 2008-11-3 10:25:14
4 887260 2008-11-3 10:25:29
5 887261 2008-11-3 10:25:36
6 887263 2008-11-3 10:25:44
7 887256 2008-11-3 10:28:38
8 887258 2008-11-3 10:28:54
9 887262 2008-11-3 10:29:24
10 887264 2008-11-3 10:29:51其中id为887263的比887262早进入数据库...请教下高手..什么情况造成这个原因?

解决方案 »

  1.   

    并发业务逻辑设置问题导致,获得max id的时间和执行insert的时间不是一个时间,所以有这种情况。
      

  2.   

    补充说明下,可能同时有多个应用程序在进行SELECT MAX(ID) FROM 表名的操作
      

  3.   

    并发原因,建议改成oracle的sequnece
      

  4.   


    恩,有这种可能!
    但是我把更详细的问题说明下,
    出现这个问题的表称为表1,里面除了上面的id,wrttime两个字段外,还要插入其它的一些字段信息,这些信息来源于表2
    应用程序在把表b2的这些字段取到后在选出表1的最大id连同这些信息一起插入表1,并在表2中有个计数的字段,如果表一中有一条记录,这个字段为1,依次类推:
    其中今天有这样个问题
    表1字段1  id      wrttime
    1000-2 887262 2008-11-3 10:29:24 表2
    计数字段
    2但是在表一中没有看见
    类似于
    字段1  id      wrttime
    1000-1 887261 
    这条记录,当第一次应用程序写入数据库是报错
    提示unique constraint(数据库_pkid)violated;查看表1,id是索引.
    但是如果第一次没写进去的话,表一中应该不会出现1000-2啊!计数字段也不会出现2啊!(相同的字段1进入表1时,依次1000-1,1000-2,1000-3.....,并且更新表2的计数字段)说明应用程序执行了两次insert,但是为什么看不见1000-1,1000-1因为什么问题而丢失了呢?因为初学oracle,所以不清楚哪方面的原因造成这个错误!~