当前位置: 代码迷 >> Sql Server >> MS SQL 存储过程 高并发,该怎么处理
  详细解决方案

MS SQL 存储过程 高并发,该怎么处理

热度:95   发布时间:2016-04-24 10:43:25.0
MS SQL 存储过程 高并发
有这么一个HTTP服务端,接收客户端信息来对一个数据库的各个表进行(增删改查)
数据库版本: MS SQL 2008
(程序用的 C#, VS2010)
我现在的做法:
建立各个存储过程,对应的方法执行对应的存储过程;
那假如有高并发现象,会出现问题吗?
我现在是对表进行加锁操作。
------解决方案--------------------
如果锁没加错就不会有问题
------解决方案--------------------
那假如有高并发现象,会出现问题吗?
--> 锁争阻塞,或死锁.

建议存储过程中需加事务处理.
------解决方案--------------------
1.1000个insert并不一定需要打开1000次链接,数据库连接可以一直打开着执行N条操作,只要记得用完了得关闭,反复打开数据库连接不是良好的编程方式。
2.锁表和锁记录要看你需求,如果你只需要操作单条记录,那锁记录就够了。
3.会,锁控制不好会发生死锁,然后后面一堆处理都无法进行
补充一点,版主说的没错,如果你存储过程里操作很多表,且这些操作都有相当的关联性,记得用事务
------解决方案--------------------
关于楼主顾忌的数据库连接断开的问题,微软早就预料到了也给你设计好了,
就是数据库连接池,ado.net中你就正常地打开关闭就行了

你说的1000个insert,如果是批量的,就放在一个事务中,如果是不同客户端的请求,那就老老实实在ado.net中按照规范来,完全没必要担心打开关闭的开销

另外关于锁表和锁行的问题,这个跟你表结构有关,假如你在表上没有任何索引,那没的说,肯定是表锁
如果的where条件上有索引,那就有可能是行锁
关于锁的粒度是数据结构和数据决定的,如果数据库觉得一个表锁的代价更定,就没必要用N个行锁



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

--请参考一下我的
USE [DB_OA]
GO
/****** Object:  StoredProcedure [dbo].[usp_Sys_RoleNewEdt]    Script Date: 05/17/2014 10:56:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/************************************************************************
*Function: Insert or update record
*Author:   Code Robot
*Date:     2013-07-26
************************************************************************/
ALTER Procedure [dbo].[usp_Sys_RoleNewEdt]
@Lang                     char(10) = '',
@TranType                 varchar(30) = null,
@RKey                     bigint = 0,
@Org_Id                   int = 0,
@Role_Name                varchar(50) = '',
@Remark                   varchar(200) = '',
@Is_Enabled               bit = 0,
@Update_User              varchar(20) = '',
@Update_Date              datetime = null,
@NewKeyValue              varchar(50) = ''
as
/*Declare*/
declare @ErrStr nvarchar(200)
if @TranType is null
begin
select @ErrStr = dbo.ufn_GetMsg('E0001',@Lang)  --Transaction type can not be null.
raisError(@ErrStr,11,1)
return 100
end

set @TranType = upper(@TranType)
if @TranType = 'NEW'
begin
if (select count(*) from Sys_Role (nolock)
where RKey = @RKey)>0
begin
select @ErrStr = dbo.ufn_GetMsg('E0004',@Lang)  --has been used.
set @ErrStr = 'RKey:'+ @RKey+' '+@ErrStr
raisError(@ErrStr,11,1)
return 101
end
begin
insert into Sys_Role with (rowlock)(
Org_Id,
Role_Name,
Remark,
Is_Enabled,
Update_User,
Update_Date
) values (
@Org_Id,
@Role_Name,
@Remark,
@Is_Enabled,
@Update_User,
@Update_Date
)
return 0
end
end

if @TranType = 'EDIT'
begin
if (select count(*) from Sys_Role (nolock)
where RKey = @RKey) = 0
begin
select @ErrStr =  dbo.ufn_GetMsg('E0003',@Lang)
set @ErrStr = @ErrStr + 'RKey'  --Can not find this Col_ID
raisError(@ErrStr,11,1)
return 102
end
update Sys_Role with (rowlock) set 
Org_Id = @Org_Id,
Role_Name = @Role_Name,
Remark = @Remark,
Is_Enabled = @Is_Enabled,
Update_User = @Update_User,
Update_Date = @Update_Date
where RKey = @RKey
return 0
end

/*If it goes here,then the transaction type passed is invalid.*/
begin
select @ErrStr = dbo.ufn_GetMsg('E0002',@Lang) + ':' + @TranType  --The transaction type that was passed in is UNKNOWN.
raisError (@ErrStr,11,1)
return 103
end
  相关解决方案