数据库中的锁
如何避免死锁
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;