数据库中的锁

如何避免死锁

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解锁

 

3)死锁 案例

在第一个连接中执行以下语句

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 table1 with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

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

------------------------------------------------------------------------------------------------

注意一下区别  HOLDLOCK\TABLOCKX 级别更高,锁定期间什么都不能操作

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

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

 总结:

1、使用SQL语句: 加上LOCK或 RowLock;
2、记得UPDATE后要COMMIT或ROLLBACK;
3、运用存储过程记得加上CLOSE;

posted on 2021-03-09 16:54  @atn  阅读(105)  评论(0编辑  收藏  举报

导航