数据库并行-锁

1:如上

2:   如何锁一个表的某一行


A   连接中执行

SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ

begin   tran

select   *   from   tablename   with   (rowlock)   where   id=3

waitfor   delay   '00:00:05 '

commit   tran

B连接中如果执行

update   tablename   set   colname= '10 '   where   id=3   --则要等待5秒

update   tablename   set   colname= '10 '   where   id <> 3   --可立即执行

2   锁定数据库的一个表

SELECT   *   FROM   table   WITH   (HOLDLOCK)  


注意:   锁定数据库的一个表的区别

SELECT   *   FROM   table   WITH   (HOLDLOCK)  
其他事务可以读取表,但不能更新删除

SELECT   *   FROM   table   WITH   (TABLOCKX)  
其他事务不能读取表,更新和删除


SELECT   语句中“加锁选项”的功能说明
    SQL   Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL   Server的缺省设置也可以在select   语句中使用“加锁选项”来实现预期的效果。   本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。
    功能说明:   
    NOLOCK(不加锁)  
    此选项被选中时,SQL   Server   在读取或修改数据时不加任何锁。   在这种情况下,用户有可能读取到未完成事务(Uncommited   Transaction)或回滚(Roll   Back)中的数据,   即所谓的“脏数据”。  
   
    HOLDLOCK(保持锁)  
    此选项被选中时,SQL   Server   会将此共享锁保持至整个事务结束,而不会在途中释放。  
   
    UPDLOCK(修改锁)  
    此选项被选中时,SQL   Server   在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。  
   
    TABLOCK(表锁)  
    此选项被选中时,SQL   Server   将在整个表上置共享锁直至该命令结束。   这个选项保证其他进程只能读取而不能修改数据。  
   
    PAGLOCK(页锁)  
    此选项为默认选项,   当被选中时,SQL   Server   使用共享页锁。  
   
    TABLOCKX(排它表锁)  
    此选项被选中时,SQL   Server   将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。

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

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

--创建测试环境
--创建测试表--部门表
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停顿的情况。。。

 
 

你可能感兴趣的:(数据库,update,commit,where,表)