手工设置id增号,怎样才能避免两个客户端同时上传时ID号相同的问题呢?
手工设置id增号,怎样才能避免两个客户端同时上传时ID号相同的问题呢? 问题点数:50、回复次数:10Top
1 楼yujohny(踏网无痕)回复于 2003-09-04 14:55:07 得分 5
在新增触发器里设置id增号,多用户操作触发器肯定是按顺序一个一个用户执行的Top
2 楼txlicenhe(马可)回复于 2003-09-04 14:55:51 得分 5
/********** 加锁 ***************
设table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
1)排它锁
新建两个连接
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran
若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
2)共享锁
在第一个连接中执行以下语句
begin tran
select * from table1 holdlock -holdlock人为加锁
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select A,C from table1
where B='b2'
update table1
set A='aa'
where B='b2'
commit tran
若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒
3)死锁
增设table2(D,E)
D E
d1 e1
d2 e2
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30'
update table2
set D='d5'
where E='e1'
commit tran
在第二个连接中执行以下语句
begin tran
update table2
set D='d5'
where E='e1'
waitfor delay '00:00:10'
update table1
set A='aa'
where B='b2'
commit tran
同时执行,系统会检测出死锁,并中止进程
--------------------------------------------------------------
SET IMPLICIT_TRANSACTIONS ON --用户每次必须显式提交或回滚。否则当用户断开连接时,
--事务及其所包含的所有数据更改将回滚
SET IMPLICIT_TRANSACTIONS OFF --自动提交模式。在自动提交模式下,如果各个语句成功
--完成则提交。Top
3 楼waterw(water)回复于 2003-09-04 14:55:53 得分 10
三种方法
1、取得最大号后,立即更新此表,最好写在一句中。
2、事务保护,取表中最大值时,用独占锁锁定,更新后立即释放。
3、设置一抢号表,只要是要取的ID的统统累加。
这三种方法各有利蹩,视情况定。Top
4 楼lgfong(铃雪儿)回复于 2003-09-04 15:05:45 得分 0
如果同一客户在同一时间所发布上去的一批记录的ID增号是相同的那又怎样解决呢?Top
5 楼newdongkui(孤独的老乌鸦)回复于 2003-09-04 15:13:07 得分 5
使用newid ,就好啦,稍微占点空间而已。全球唯一哦Top
6 楼wengdy2000(浪子)回复于 2003-09-04 15:52:09 得分 5
铃雪儿:
这种情况很少见的,
不知道你看到过没有,Top
7 楼nobelpu(老蒲)回复于 2003-09-04 16:14:59 得分 5
ID相同好解决,ID断号就难解决了。Top
8 楼liao2001(知之为知之,不知为不知。。。)回复于 2003-09-04 17:07:51 得分 10
如果只操作一个表,试试这个:
begin tran
update table1 set a=1 //a 为字段名
where 1==2
。。。//select、insert、delete 。。。
commit tran
如果操作多表,并且客户端是由自己设计的话,对表进行相同顺序的加锁;
考虑到多个系统访问相同db,可以考虑加入加锁超时Top
9 楼subscribe(subscribe)回复于 2003-09-04 17:16:50 得分 2
gzTop
10 楼lionstar(小狮子)回复于 2003-09-04 18:01:41 得分 3
可以先建立一个表,其中包含自动增长字段,插入前取出id号,@@identify
然后应用作为插入记录的主键就可以了。
开心就好!!!Top




