关于问题一 --表名TABLE1,自动增加字段ID CHAR(10),避免空号 SELECT RIGHT('0000000000' + LTRIM(STR((ISNULL(MIN(ID),'0'))+1)),10) FROM TABLE1 WHERE RIGHT('0000000000' + LTRIM(STR((ISNULL(ID,'0'))+1)),10) NOT IN ( SELECT B.ID FROM TABLE1 B )
至于在第一个问题中,update前用select取出可用的编号(包括最小号或者当前最大号,至于怎样取,前面已经讲清楚了),然后在update时增加一个条件,即: where code=:curcode //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
至于在第一个问题中,update前用select取出可用的编号(包括最小号或者当前最大号,至于怎样取,前面已经讲清楚了),然后在update时增加一个条件,即: where code=:curcode //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
至于在第一个问题中,update前用select取出可用的编号(包括最小号或者当前最大号,至于怎样取,前面已经讲清楚了),然后在update回时增加一个条件,即: where code=:curcode //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
0001, 1
0002, 1
0003, 1
... ...
9999, 1
然后,每用掉一个,把1改成0.不过要把SELECT和UPDATE放在一个TRANSACTION里.
--表名TABLE1,自动增加字段ID CHAR(10),避免空号
SELECT RIGHT('0000000000' + LTRIM(STR((ISNULL(MIN(ID),'0'))+1)),10)
FROM TABLE1
WHERE RIGHT('0000000000' + LTRIM(STR((ISNULL(ID,'0'))+1)),10) NOT IN (
SELECT B.ID
FROM TABLE1 B
)
几个人抢号的问题你可以用Update将该表锁住,然后取出数据,再将锁放开,有很小的速度影响,不过应该没问题。
首先你必须打开事务,从调用存储过程,一直到前台查询临时表数据,都必须在同一个事务里,否则一定会出问题。以下我说的都是指就算在同一个事务里也会出现的其他问题。
A,B放入临时表中的数据,如果和临时表中本身的数据相关,则临时表放入后,数据可能是错误的。因为先查询出数据直到放临时表之前,临时表都没有被上锁,只有当临时表中的数据改变后临时表才能上锁,阻断另一个事务。
A,B同时调用时,先操作临时表的事务,会锁定临时表,另一个事务被阻断,当先操作临时表的事务COMMIT或ROLLBACK后,另一个事务才能开始操作临时表。所以如果第一个事务一直不提交或回滚,则第二个事物就一直被阻塞,其他人就一直不能看到数据。从实现的效率上说,可以说是最底的。
我到建议你为不同的事务建立不同的临时表,使用后就丢弃,这样自己使用自己的临时表就可以避免阻塞,数据也不会别别的事务篡改。
首先你必须打开事务,从调用存储过程,一直到前台查询临时表数据,都必须在同一个事务里,否则一定会出问题。以下我说的都是指就算在同一个事务里也会出现的其他问题。
A,B放入临时表中的数据,如果和临时表中本身的数据相关,则临时表放入后,数据可能是错误的。因为先查询出数据直到放临时表之前,临时表都没有被上锁,只有当临时表中的数据改变后临时表才能上锁,阻断另一个事务。
A,B同时调用时,先操作临时表的事务,会锁定临时表,另一个事务被阻断,当先操作临时表的事务COMMIT或ROLLBACK后,另一个事务才能开始操作临时表。所以如果第一个事务一直不提交或回滚,则第二个事物就一直被阻塞,其他人就一直不能看到数据。从实现的效率上说,可以说是最底的。
我到建议你为不同的事务建立不同的临时表,使用后就丢弃,这样自己使用自己的临时表就可以避免阻塞,数据也不会别别的事务篡改。
另外楼主说的问题,实现起来确实有一定的难度,
where code=:curcode //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
where code=:curcode //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
where code=:curcode //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的