问题如下:多个客户端共享一个数据(在此称为序列号),这个序列号以递增的形式出现,所以就变成每个客户端每次用的序列号不同,现在的问题是要正确取到号。我的实现是把这个序列号存在数据库中,每个客户端每次取完后以增1的形式再更新回去,这样保证唯一性,现在的问题是如何控制这个唯一性,用事务、锁、还是什么办法?(我用的是mysql数据库,前台用vb)
解决方案 »
- MySQL不能写入中文
- 安装mysql最后一步老是报错!请高手进来看下错误信息,帮解答下!
- mysql如何提高数据库的排序效率?
- Mysql查询语句问题
- 下面建表的SQL语句,有些地方不知是什么意思,请各位帮忙看一下!
- "can't create table "错误不解,在线等待
- 在远端如何备份mysql的数据库?
- Mysql5.1安装后在环境变量里没有配置 需不需要手动配置
- Mysql如何在某个时间段内,统计每一天的访问ip,相同的只被计算一次且根据来访设备分组?
- MFC ADO 以 MySQL 为驱动插入数据,1个连接1秒最多插入多少条?我写的最多2000条左右
- 自己的mysql数据库只能本地登陆,无法远程登录
- 查询很慢啊
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>
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>
老大,那要是每天都是重新开始的情况呢??能否告知qq,小弟高分答谢
lock table tb_name read, tb_name as t2 WRITE
其实,你可以把这个取值及更新的操作写成一个存储过程,通过上面说的方法加锁,因表只有一条记录,所以,操作效率应该很高的(其实你可以测试下看看),这个有点类似oracle下的sequence的取法。
一种简单的设计思路。放个定时任务,每天 晚上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级安全的,所以不会出现重复。