SQLSERVER2000中,数据库锁定,如何操作?(100分)

H

Hecules

Unregistered / Unconfirmed
GUEST, unregistred user!
我的开发环境:DELPHI6 + SQLSERVER2000 (ADO)
我的系统,是可以在多人同时操作的环境下工作。也就是说:可能有某一时间,
几个人同时操作了一个表。
比如:我在一个事务中,
第一步:先生成单据号。
(单据号的生成规则是:在表中读单据号,取最大的单据号。再加“1”)
第二步:一些必要的校验。
第三步:再写数据表。
第四步:写其它的表。
第五步:提交(或出错:回滚)。
但是:事务,只能保证,同一个用户,在事务中操作的几张表的数据一致。
却不能保证,不同的用户,对同一表的一先一后的操作而发生的错误。
错误举例:
当一个用户,先读了此表,取了表中单据号最大的,再加“1”,生成了一个
新的单据号。正在作:必要的校验时,尚未写入数据到表中;在这个时候,
第二个用户,进入了事务,也读了此表,取了表中单据号最大的,由于,第一
个用户,尚未写入数据到表中,所以,第二个用户生成的单据号,就和,第一
个用户一样了。这样,就出错了。
请问:如何处理,这样的错误,我的初步想法,有没有办法。在事务开始时,
锁定整个数据库。直到;事务结束。
还是,有别的办法?
谢谢。急。在线等。
 
其实单据号没有必要先生成,而是在提交时,由数据库自身去维护形成,增加触发过程!
 
当然,我上面,是打个比方。是个例子。
再如:货品编号。货品编号,要根据货品的属性。要计算得到。
是要,先计算,再,写入的。
如何处理?
 
这样的话最好用存储过程来生成单据号,结合事物处理和锁机制。
 
TO:mlzhou
你的意思,是把所有的操作放到:存储过程中,并在存储过程中,加锁。
在:DELPHI中用事务,在事务中调用存储过程。
是这样么?
 
差不多,存储过程中也可以用事物。
 
是不是:还有一种方法。就是:我再另建一张表。作为:锁定信息表。
要锁定的,的。资料,写入表中。其它的用户,需要此资料时,
先访问此锁定信息表。若所需资料,被锁定,等待。直到:资料被解锁。
当然。要设定一个时间。防止,用户死锁。

这样,可行否?
 
不用另建表。
 
出错后自动重好一次即可,毕竟连续出错的机率太小了。
 
同意:mlzhou
这样的话最好用存储过程来生成单据号,结合事物处理和锁机制。
用存储过程来处理。双快,双准。
 
多人接受答案了。
 
顶部