<<<<<<高并发查找序号问题,高手来帮忙!!!>>>>>>>
有人做过并发量比较高的大系统吗?
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 预算表
它并发不并发有什么关系呢? 还不是找出一样的值.
并发影响,在要修改删除上做文章.
------解决方案--------------------我觉得专门建立一个存储最大编码的表,这样就不用检索了,
每次保存的时候就更新一下就可以了