--锁定记录,只允许单用户修改的例子:
--创建测试环境
--创建测试表--部门表
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® sql server™ 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® sql server™ 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