日期:2014-05-18  浏览次数:20505 次

<<<<<<高并发查找序号问题,高手来帮忙!!!>>>>>>>
有人做过并发量比较高的大系统吗?  
CREATE   FUNCTION   f_NextNbr()
RETURNS   char(8)
AS
BEGIN
RETURN(
SELECT   MAX(序号)
FROM   预算表   WITH   (XLOCK,   PAGLOCK)
)
END
GO  
我用上述存储过程找最大序号~~~数据量并发量上去后有没有影响?会不会死锁概率提高呢?
关键对(XLOCK,   PAGLOCK)这个有点怀疑~~~~~是不是必须有索引之类的配合
我的预算表主键是Guid,序号是其中一列。

------解决方案--------------------


CREATE PROCEDURE GETMAXKEYNO
--Declare
@TableName varchar(20), /* 要取号的表名 */
@DESCRIPT varchar (50), /* 参数说明 */
@VTYPE VARCHAR (2), /* 参数类型 */
@RESULTSTR varchar(20) OutPut, /*返回的编号*/
@ATT_DEPT_ID VARCHAR (12)
AS
BEGIN
Declare @No varchar(20),@TempValue integer
--> > > > > > > > > >

Select @No = PARAM_VALUE From SYS_PARAMS
Where CATEGORY = @TableName and PARAM_NAME = 'KEY_NO ' AND ATT_DEPT_ID=@ATT_DEPT_ID

If @No Is NULL
begin
delete From SYS_PARAMS
Where CATEGORY = @TableName and PARAM_NAME = 'KEY_NO '
AND ATT_DEPT_ID=@ATT_DEPT_ID
Insert Into SYS_PARAMS(CATEGORY,PARAM_NAME,PARAM_VALUE,ATT_DEPT_ID)
Values(@TableName, 'KEY_NO ', '0 ',@ATT_DEPT_ID)
end

Select @TempValue = CONVERT(INT,ISNULL(@NO,0))+1
Select @NO = CONVERT(VARCHAR,@TEMPVALUE)

Update SYS_PARAMS Set PARAM_VALUE = @NO
Where CATEGORY = @TableName and PARAM_NAME= 'KEY_NO ' AND ATT_DEPT_ID=@ATT_DEPT_ID

--> > > > > > > > > > > > > > > > > > > >
UPDATE SYS_PARAMS SET DESCRIPT=@DESCRIPT,
VTYPE =@VTYPE
Where CATEGORY = @TableName and PARAM_NAME = 'KEY_NO '
AND ATT_DEPT_ID=@ATT_DEPT_ID

--> > > > > > > > >

SELECT @RESULTSTR = @NO
END

GO
------解决方案--------------------
SELECT MAX(序号)
FROM 预算表 WITH (XLOCK, PAGLOCK)
-----------------------------------------

既然是高并发,建议改为WITH (ULOCK,ROWLOCK).
------解决方案--------------------
还要一个READPAST.
------解决方案--------------------
SELECT MAX(序号) FROM 预算表

它并发不并发有什么关系呢? 还不是找出一样的值.

并发影响,在要修改删除上做文章.


------解决方案--------------------
我觉得专门建立一个存储最大编码的表,这样就不用检索了,
每次保存的时候就更新一下就可以了