有这样一种情况,我有一张用户表,一张发卡表,一张记录用户与卡关系的关系表。现在问题是如何控制一个用户只能申请到一张表,而不会出现两个客户同时申请一张卡的情况,即一个客户唯一对应一张卡呢。采用什么策略进行控制会比较好呢?

解决方案 »

  1.   

    使用事务(transaction),整个过程,要么全不做,要么全部做.不允许只做一般.事务流程: 用户申请-->开始事务-->更新发卡表-->更新关系表-->更新用户表-->提交.如果事务过程出错或超时(可设置),回滚整个事务,相当于没发生过.
      

  2.   

    时间戳也是不错的选择
    create table tb(id int,name varchar(5),timestamp)insert tb 
     select 1,'aa',null 
    insert tb 
     select 2,'bb',null  
     
    select * from tb 
    /*
    id          name  timestamp
    ----------- ----- ------------------
    1           aa    0x00000000000036B3
    2           bb    0x00000000000036B4*/
    update tb set name='cc' where id=1select * from tb
    /*id          name  timestamp
    ----------- ----- ------------------
    1           cc    0x00000000000036B5
    2           bb    0x00000000000036B4*/
    --可以看到 修改前0x00000000000036B3,修改后0x00000000000036B5
    --一旦有一个人修改timestamp就会变化,所以多用户操作时,每个用户把修改前得timestamp拿出来
    --当执行自己的update时,判断一下,比较当前的timestamp跟修改时拿出来的timestamp,如果不同就说明有人改过
    --返回页面提示用户,已经被人修改,酱紫的。