我建了两个结构相同的表,A表和B表,A表是总表,B表是临时表,记录添加时先存在B表中,在B表保存后,再添加到A表(总表)中,现在出现一个问题,当两个人同时向B表中添加记录时,后一个人会把第一个人添加的记录冲掉,也就是说不能两个人同时向B表中添加记录,这个问题如何解决,请高人指点!

解决方案 »

  1.   

    采用锁表方式啊,你用数据库连的begintran方法,完了之后就commit提交,
    还有一种办法就是不用拷贝ID号进来,在B表中把ID号设为自动增加,应该不会出现你说的问题吧?
      

  2.   

    非常感谢兄台,我有一点没有表达清楚,就是A表中有一个字段是自动生成的订单号,
    如:HLOT-05-0001,下一个应为HLOT-05-0002,....0003,.... 每次添加一个新的订单时,
    B表依据A表中的订单号自动生成下一个订单号.
        如果两个人同时向B表添加,而第一个人还没有保存,也就是没有把B表中的数据保
    存到A表中,会出现错误:
        1/两个人生成的规格单号相同的.
      2/第二个人添加时记录添加到第一个的记录里.
      

  3.   

    用排它锁试试
    A--------运行
    BEGIN TRANSACTION
    SELECT * FROM Inserted WITH (XLOCK) '如果B也运行 SELECT * FROM Inserted WITH (XLOCK)
    COMMIT                              '就会等待直到A COMMIT为止
      

  4.   

    这个需求很奇怪啊,为什么要用临时表呢?私下猜想一下哈:
    我刚学vb的时候也干过这样的傻事阿:
    界面拉了一个ado控件,绑定一下,然后填什么东西就直接存进数据库里了阿
    但是人家要有保存按钮,还要有放弃保存功能啊?怎么办呢?
    于是就建一个临时表.....不知道是不是这样啊?
    如果不幸猜中的话,删掉临时表,试一下用断开式记录集啊:设置属性:
        Adodc1.CursorLocation = adUseClient
        Adodc1.CursorType = adOpenKeyset
        Adodc1.LockType = adLockBatchOptimistic
        
    保存记录:    
        Adodc1.Recordset.UpdateBatch
    不保存:
        Adodc1.Recordset.CancelBatch其他都一样用哈~~要是没猜对,就当我没说,嘿嘿~~~
      

  5.   

    LZ的程序肯定有个类似“添加记录”的地方,按一下它就给你个订单号,然后用户输入其他域的内容,最后保存记录,因此当A里没有下一编号的记录时,产生的号码总是这条,不管你按几次“添加记录”。顺这个思路下去,要避免同一号码那必须把系统产生的号码存起来(又是个临时表),或者一次性产生足够多的号码,形成号码池,再加个标记:已使用、已分配、可用。实在是麻烦,还是用自动增长字段方便,等记录保存后反馈给用户一个号码得了。
      

  6.   

    关于自动编号的问题,这样做:
    肯定得有个规则:假如编号规则是:abc00001,那么:前面abc是字符,后面是序号
    假如字段名:Code1、在数据库里面,设置唯一性索引2、vb里面
    private function get_maxcode() as string
        dim cn as new adodb.connection
        dim strSql as string
        dim rsCode as new adodb.recordset
        dim strCode as string
    '取数据库中最大编号
        cn.connectstring="数据库连接字串"
        set rscode.activeconnection = cn
        rscode.open "select max(Code) as MaxCode form 表名"
    '计算最大编号+1
        strCode = rsCode("MaxCode")
        strCode = "abc" & clng(replace(strCode,"abc",""))+1
    '返回可用编号
        get_maxcode=strCode
    end function3、在保存数据之前,调用函数赋值:
    rsData("Code") = get_maxcode
    rsData.UpdateBatch因为取数、赋值、保存这些动作,前后相隔是毫秒级的,所以在这个间隔中,两个人发生冲突的机会非常小。
    那么万一真的发生冲突会怎样呢?
    因为数据库有唯一性约束,两个人取了重复的Code的话,第二个保存的人会出错,并返回信息“违反约束...”
    这时候他只要再点保存按钮一下,那么就会重新取Code,可以存进去了。