访问数据库时如何解决并发问题2

 --或者自己加锁(控制更灵活)

--锁定记录,只允许单用户修改的例子:

--创建测试环境
--创建测试表--部门表
create table 部门(departmentid int,name varchar( 10))

--记录锁定表
create table lock(departmentid int,dt datetime)

go
--因为函数中不可以用getdate,所以用个视图,得到当前时间
create view v_getdate as select dt=getdate()
go
--创建自定义函数,判断记录是否锁定
create function f_chk(@departmentid int)
returns bit
as
begin
declare @re bit,@dt datetime
select @dt=dt from v_getdate

if exists(select 1 from lock where departmentid=@departmentid
and datediff(ss,dt,@dt)<5)
set @re=1
else
set @re=0
return(@re)
end
go

--数据处理测试
if dbo.f_chk(3)=1
print '记录被锁定'
else
begin
--也可以是查询
begin tran
insert into lock values(3,getdate())
update 部门 set name='A' where departmentid=3
delete from lock where departmentid=3
commit tran
end

--删除测试环境
drop table 部门
drop view v_getdate
drop function f_chk

如果是死锁可以查一下:1:sp_who 或 sp_who2
2: Select * from sysprocesses where blocked <> 0
3:
 企业管理器->服务器->管理工具->活动->当前活动 然后把他kill掉。。。
 进程信息中,如果发现旁边有一个锁状的图标,就表明这个进程是死锁,kill掉
4:SQL事件探查器,监控一下,看主要是那些处理引起的死锁.然后做相应的处理.用事件探查器new一个trace,
监视一下造成你sqlserver停顿的情况。。。最好的办法还是检查一下引起锁的原因,一般是由你的代码引起的。

========================================

set   transaction   isolation   level  
  控制由连接发出的所有   microsoft&reg;   sql   server&#8482;   select   语句的默认事务锁定行为。  
   
  语法   

 set   transaction   isolation   level  
          {   read   committed  
                  |   read   uncommitted  
                  |   repeatable   read  
                  |   serializable    
          }  
   
  参数  
  read   committed  
   
  指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是   sql   server   的默认值。  
   
  read   uncommitted  
   
  执行脏读或   0   级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置   nolock   相同。这是四个隔离级别中限制最小的级别。  
   
  repeatable   read  
   
  锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。  
   
  serializable  
   
  在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有   select   语句中的所有表上设置   holdlock   相同。  
   
  注释  
  一次只能设置这些选项中的一个,而且设置的选项将一直对那个连接保持有效,直到显式更改该选项为止。这是默认行为,除非在语句的   from   子句中在表级上指定优化选项。  
   
  set   transaction   isolation   level   的设置是在执行或运行时设置,而不是在分析时设置。  
   
  示例  
  下例为会话设置   transaction   isolation   level。对于每个后续 

transact-sql   语句,sql   server   将所有共享锁一直控制到事务结束为止。  
   
  set   transaction   isolation   level   repeatable   read  
  go  
  begin   transaction  
  select   *   from   publishers  
  select   *   from   authors  
  ...  
  commit   transaction  
   
sql   自動會選擇鎖的粒度  
   
   
  锁定提示  
  可以使用   select、insert、update   和   delete   语句指定表级锁定提示的范围,以引导   microsoft&reg;   sql   server&#8482;   2000   使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。  
   
   
   
  说明     sql   server   查询优化器自动作出正确的决定。建议仅在必要时才使用表级锁定提示更改默认的锁定行为。禁止锁定级别反过来会影响并发。  
   
   
  锁定提示   描述    
  holdlock   将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。holdlock   等同于   serializable。    
  nolock   不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于   select   语句。    
  paglock   在通常使用单个表锁的地方采用页锁。    
  readcommitted   用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,sql   server   2000   在此隔离级别上操作。    
  readpast   跳过锁定行。此选项导致事务跳过由其它事务锁定的行,而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。readpast   锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于   select   语句。    
  readuncommitted   等同于   nolock。    
  repeatableread   用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。      
  rowlock   使用行级锁,而不使用粒度更粗的页级锁和表级锁。    
  serializable   用与运行在可串行读隔离级别的事务相同的锁语义执行扫

描。等同于   holdlock。    
  tablock   使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,sql   server   一直持有该锁。但是,如果同时指定   holdlock,那么在事务结束之前,锁将被一直持有。    
  tablockx   使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。    
  updlock   读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。updlock   的优点是允许您读取数据并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。    
  xlock   使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用   paglock   或   tablock   指定该锁,这种情况下排它锁适用于适当级别的粒度。    
   
   
  例如,如果将事务隔离级别设置为   serializable,并且在   select   语句中使用表级锁定提示   nolock,则键范围锁通常用于维护不采用可串行事务。  
   
  use   pubs  
  go  
  set   transaction   isolation   level   serializable  
  go  
  begin   transaction  
  select   au_lname   from   authors   with   (nolock)  
  go 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值