深入解析MS-SQL锁机制

2020-07-10 08:06:22易采站长站整理


3) 设置事务隔离级别。


4 ) 对 SELECT、INSERT、UPDATE 和 DELETE 语句使用表级锁定提示。


5) 配置索引的锁定粒度
可以使用 sp_indexoption 系统存储过程来设置用于索引的锁定粒度


六 查看锁的信息
1 执行 EXEC SP_LOCK 报告有关锁的信息
2 查询分析器中按Ctrl+2可以看到锁的信息


七 使用注意事项
如何避免死锁
1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;
4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁


解决问题 如何对行 表 数据库加锁


八 几个有关锁的问题


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

相关文章 大家在看