问题如下:多个客户端共享一个数据(在此称为序列号),这个序列号以递增的形式出现,所以就变成每个客户端每次用的序列号不同,现在的问题是要正确取到号。我的实现是把这个序列号存在数据库中,每个客户端每次取完后以增1的形式再更新回去,这样保证唯一性,现在的问题是如何控制这个唯一性,用事务、锁、还是什么办法?(我用的是mysql数据库,前台用vb)

解决方案 »

  1.   

    MYSQL中有自增列啊,你可以直接用这个。auto_increment.
    mysql> create table renzaijiang (id int primary key auto_increment, col int);
    Query OK, 0 rows affected (0.28 sec)mysql>
    mysql> insert into renzaijiang values (null,10);
    Query OK, 1 row affected (0.06 sec)mysql> select * from renzaijiang;
    +----+------+
    | id | col  |
    +----+------+
    |  1 |   10 |
    +----+------+
    1 row in set (0.00 sec)mysql> insert into renzaijiang values (null,20);
    Query OK, 1 row affected (0.03 sec)mysql> select * from renzaijiang;
    +----+------+
    | id | col  |
    +----+------+
    |  1 |   10 |
    |  2 |   20 |
    +----+------+
    2 rows in set (0.00 sec)mysql>
      

  2.   

    自增字段,插入后用LAST_INSERT_ID()即可取得,在网络上也是一样。
      

  3.   

    直接用MYSQL的LAST_INSERT_ID函数即可,不用锁表、库
      

  4.   

    如果这样,如果是我来实现,最简单的方法还是用自增字段!利用查询你可以得到 (id-1) % 10000 +1 这样你的取值范围还是 1-10000mysql> set @id=9999;
    Query OK, 0 rows affected (0.00 sec)mysql> select (@id-1)%10000+1;
    +-----------------+
    | (@id-1)%10000+1 |
    +-----------------+
    |            9999 |
    +-----------------+
    1 row in set (0.00 sec)mysql> set @id=10000;
    Query OK, 0 rows affected (0.00 sec)mysql> select (@id-1)%10000+1;
    +-----------------+
    | (@id-1)%10000+1 |
    +-----------------+
    |           10000 |
    +-----------------+
    1 row in set (0.00 sec)mysql> set @id=10001;
    Query OK, 0 rows affected (0.00 sec)mysql> select (@id-1)%10000+1;
    +-----------------+
    | (@id-1)%10000+1 |
    +-----------------+
    |               1 |
    +-----------------+
    1 row in set (0.00 sec)mysql> set @id=20001;
    Query OK, 0 rows affected (0.00 sec)mysql> select (@id-1)%10000+1;
    +-----------------+
    | (@id-1)%10000+1 |
    +-----------------+
    |               1 |
    +-----------------+
    1 row in set (0.00 sec)mysql>
      

  5.   

    当然你也可以通过 LOCK TABLES xxxx WRITE; 来加锁,待你 select , update 后再 UNLOCK TABLES 来实现。
      

  6.   

    ACMAIN_CHM
    老大,那要是每天都是重新开始的情况呢??能否告知qq,小弟高分答谢
      

  7.   

    是的,我有考虑过LOCK TABLES xxxx WRITE,但是不知道在多客户端并发的时候是否有效率或者什么问题?
      

  8.   

    那考虑下自己加锁来控制好了,表只需一条记录即可(即只记录当前的值,若值达到某值时,再从0开始):
    lock table tb_name read, tb_name as t2 WRITE
      

  9.   


    其实,你可以把这个取值及更新的操作写成一个存储过程,通过上面说的方法加锁,因表只有一条记录,所以,操作效率应该很高的(其实你可以测试下看看),这个有点类似oracle下的sequence的取法。
      

  10.   


    一种简单的设计思路。放个定时任务,每天 晚上0:00时 (定时任务可参见 http://topic.csdn.net/u/20091020/22/c51bb709-6dbc-4fd1-b874-077714ed547e.html
    mysql> drop table if exists seq_no_tbl;
    Query OK, 0 rows affected, 1 warning (0.00 sec)mysql>
    mysql> create table seq_no_tbl (id int primary key auto_increment);
    Query OK, 0 rows affected (0.09 sec)用户使用时,只需要 insert into seq_no_tbl values (null);select LAST_INSERT_ID(); 得到序列号
    mysql> insert into seq_no_tbl values (null);
    Query OK, 1 row affected (0.05 sec)mysql> select LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    1 row in set (0.00 sec)mysql>由于序列号是SESSION级安全的,所以不会出现重复。
      

  11.   

    如果你真要普通方法来处理的话,选择INNODB引擎吧。
      

  12.   

    换个思路吧,别用 TABLE 了,锁表啥的挺麻烦的 :)自己实现一个 UDF,想要啥逻辑都可以,hehe