微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLSERVER2000锁

from:  作者:znsoft 发表日期:2006-10-16  

1 如何锁一个表的某一行

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM table  ROWLOCK  WHERE id = 1

2 锁定数据库一个

SELECT * FROM table WITH (HOLDLOCK)

加锁语句:
sybase:
       update 表 set col1=col1 where 1=0 ;
MSsql:
       select col1 from 表 (tablockx) where 1=0 ;
oracle:
       LOCK TABLE 表 IN EXCLUSIVE MODE ;
加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁

几个例子帮助大家加深印象
设table1(A,B,C)
A    B    C
a1   b1   c1
a2   b2   c2
a3   b3   c3

1)排它锁
新建两个连接
在第一个连接中执行以下语句
begin tran
   update table1
   set A='aa'
   where B='b2'
   waitfor delay '00:00:30'  --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
   select * from table1
   where B='b2'  
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

2)共享锁
在第一个连接中执行以下语句
begin tran
   select * from table1 holdlock -holdlock人为加锁
   where B='b2'
   waitfor delay '00:00:30'  --等待30秒
commit tran

在第二个连接中执行以下语句
begin tran
   select A,C from table1
   where B='b2'
   update table1
   set A='aa'
   where B='b2'  
commit tran

若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒

3)死锁
增设table2(D,E)
D    E
d1   e1
d2   e2
在第一个连接中执行以下语句
begin tran
   update table1
   set A='aa'
   where B='b2'
   waitfor  delay '00:00:30'
   update table2
   set D='d5'
   where E='e1'
commit tran
  
在第二个连接中执行以下语句
begin tran
   update table2
   set D='d5'
   where E='e1'
   waitfor  delay '00:00:10'
   update table1
   set A='aa'
   where B='b2' 
commit tran

同时执行,系统会检测出死锁,并中止进程

二:大力
1 如何锁一个表的某一行


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) 其他事务不能读取表,更新和删除

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐