两张表ID是 自增的
TabA
ID   Code
1    CodeA0002
2    CodeA0003
3    CodeA0004
4    CodeA0005
5    CodeA0006TabB  A_ID关联TabA的ID
ID  A_ID  Code
1   1     CodeB0002
2   1     CodeB0003
3   2     CodeB0004
4   2     CodeB0005
5   2     CodeB0006Code的生成是用MAX(ID) 然后组合字符串得到的向现在的表添加新记录时,先获取TabA的MAX(ID)+1(6+1)生成CodeA0007
然后Insert 新记录
TabA
ID   Code
...  ...
6    CodeA0007然后得到TabA的新ID(6)再获取TabB的MAX(ID)+1(6+1)生成CodeB0007
然后Insert 新记录
TabB
ID   A_ID   Code
...  ...    ...
6    6      CodeB0007
全部数据库操作都用一个事务
压力测试时,会出现重复的Code,请问这个要怎么处理调试发现,当程序中断在Insert TabA 之后,其他人还是可以继续添加记录……但库表是锁住的
中断继续之后会变成这样
TabA
ID   Code
1    CodeA0002
2    CodeA0003
3    CodeA0004
4    CodeA0005
5    CodeA0006
6    CodeA0007 (中断记录)
7    CodeA0008 (中断过程中的新增记录)TabB  A_ID关联TabA的ID
ID  A_ID  Code
1   1     CodeB0002
2   1     CodeB0003
3   2     CodeB0004
4   2     CodeB0005
5   2     CodeB0006
6   7     CodeB0007   (中断过程中的新增记录)
7   6     CodeA0008   (中断记录)
研究几天都不知道是什么问题,请高人指点

解决方案 »

  1.   

    id是自增的,就用计算列做为编号,不过这样不能索引,也可以用触发器生成编号,不要觉得触发器不好,oracle的自增长字段都是通过触发器实现的。
      

  2.   

    可以试试.TabB中生成Code时,改成用scope_identity()得到刚插入的id,用此id生成CodeB0007 
      

  3.   

    建一个只有一个自动编号的标识字段的表,然后每次去insert一个取出来就可以得到类似oracle sequence的效果
      

  4.   

    触发器不能用,不能动数据库
    2楼的方法,我要怎么补0?比如CodeB0011的时候只有两个0
      

  5.   


    MAX(ID)的时候都读取到同一个id,就会出现编号重复的情况,
    每个表增加一列timestamp字段
    插入前获取一次timestamp的值,插入时再获取一个timestamp值比较是否相同,也可以用触发器控制 用1个字段记录更新时间modifyDate 
    create trigger tr_t on t 
    after update 
    as 
    update t 
    set modifyDate=getdate() 
    from 
    t join inserted i on t.ID=i.ID
      

  6.   


    --可以考虑使用自定义函数来实现:
    --得到新编号的函数
    create FUNCTION f_NextBH()
    RETURNS char(9)
    AS
    BEGIN
    RETURN(SELECT 'CodeA'+RIGHT(10000+ISNULL(RIGHT(MAX(code),4),0)+1,4) FROM taba WITH(XLOCK,PAGLOCK))
    END
    GO--在表中应用函数
    CREATE TABLE taba(
    id int,
    code char(9) PRIMARY KEY DEFAULT dbo.f_NextBH())--插入资料
    INSERT taba(id) VALUES(1)
    INSERT taba(id) VALUES(2)
    INSERT taba(id) VALUES(3)--显示结果
    SELECT * FROM taba
      

  7.   

    不能用 Max(ID),在大量并发的时候会出现重复值。其实用触发器是比较好的解决办法,但你又不能用。你看看这样行不行:
    先使用 SCOPE_IDENTITY() 函数获取本次插入的 ID 值,然后再 Update 刚插入的记录。
    在字符串前面补 0,可以用 REPLICATE() 函数搭配 LEN() 完成。
      

  8.   

    我用Insert然后返回ID再组合出Code 然后Update
    问题已解决,谢谢大家