有这么一个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