我有一个系统 服务器端数据库只建立了一个用户 客户端2个都是用这个用户登录 在做交易插入销售表的时候先查询max(saleid)然后插入新一条记录 出现问题是两个客户端同事交易时可能一个成功另外一个不成功,还有可能是两个记录都插入了但是saleid值确一样 这得怎么处理啊 ?我修改应用程序用了事务处理,这样应该是能解决插入数据id相同问题,但是多机访问的时候是不是还是有可能会一个成功另一个失败?这个问题怎么处理?

解决方案 »

  1.   

    你的saleid不是自动生成的(递增)?
      

  2.   

    你利用了事务,在多机访问时,会一个事务一个事务的处理的。
    而且sqlserver采用的是表级锁,所以当你在执行时,会把此表锁住,其它用户会等待。
    对于查询等,建议要用 select * from table with(nolock)这样可以不用等待即可查询出信息,这也是操作SQL正确的访问方式。理解的如果不对,请别笑话我呵
      

  3.   

    我的表里主键saleid不是自动生成的,已经在运行的数据库所以估计不能改。
      

  4.   

    是不是多客户端操作的时候,如果同事插入数据是有等待问题的?已经设置了saleid不是自动生成的,那是不是我也需要在事务中通过select max(saleid)先获得新插入saleid的值,然后插入再commit?一个客户端执行这个事务的时候另一个客户端如果同时插入,只能等待然后尝试再执行一次事务?
      

  5.   

    我的数据库中一个交易用下面存储过程来实现,是这样的
    select max(userid) from tab_a
    insert into tab_a........
    select max(mid) from tab_b
    insert into tab_b........
    insert into tab_c........服务器端用TDatabase连接数据库,用户和密码设定了一个;还有另一个交易用如下事务处理
    StartTransaction
    update tab_a......
    update tab_c.......
    update tab_b.......
    insert tab_c.......
    .......
    Commit
    sleep(800)我在2个客户端应用程序用到上面两个交易,只要这两个交易同事发生,就有可能系统停止相应,这个是什么问题?是不是我所有的客户端都是以一个数据库用户登录引起的?