SQL Server和Oracle中的锁和死锁
2008-09-02 12:46:27 来源:WEB开发网当我们查询到死锁的进程的信息可以使用KILL命令终止这个产生死锁的ORACLE会话进程:
alter SYSTEM KILL SESSION ’查出的SID,查出的SERIAL#’;
其中SID即V$LOCKED_OBJECT 的SESSION_ID, serial#为V$session的serial#。
再杀操作系统进程:
KILL SPID或ORAKILL 刚才查出的SID 刚才查出的SID
SQL SERVER :
要监视SQL SERVER 的锁活动,有如下几种常用的方法:
1) 使用SP_LOCK和SP_WHO存储过程。
2) 直接查询syslockinfo表。
3) 使用SQL SERVER Management studio的活动监视器浏览锁活动。
4)使用SQL Profiler浏览锁活动。
让我们看看SQL SERVER Management studio的活动监视器浏览锁的页面,如下图:
这个列表返回的信息和使用SP_lock返回的信息是一致的,比如
exec SP_lock
GO
这个命令的输出样本如下:
spid dbid ObjId IndId Type Resource Mode Status
------ ------ ----------- ------ ---- --------------------------------
52 5 0 0 DB S GRANT
52 5 148195578 1 PAG 1:489 IX GRANT
52 5 148195578 0 TAB IX GRANT
52 5 148195578 1 KEY (07005a186c43) X GRANT
54 1 1115151018 0 TAB IS GRANT
54 5 0 0 DB S GRANT
这个样本提供了下列的信息:
Spid 是事务的进程ID。
dbid 是持有锁的的数据库ID。
ObjID是持有锁的资源ID 。
IndId 是持有锁的表索引ID 。
Type是持有资源的锁类型。
Resource 是持有锁的资源内部名称,这个信息来自 syslockinfo 系统表。
Mode是事务请求的锁模式,锁类型请参考本文的锁模式一节
STATUS 是请求的当前状态。取值为 GRANT/WAIT/GNVRT .
我们发现上面的样本信息中出现了很多X类型的锁,如果该X锁引起了阻塞或死锁等现象,我们可以使用KILL命令解决解决锁争用,Sql server通过使用KILL 命令终止锁进程。
比如:
KILL 52
5 、避免死锁
ORACLE :
1) 避免应用不运行长事务。
2) 经常提交以避免长时间锁定行。
3) 避免使用LOCK命令锁定表。
4) 在非高峰期间执行DDL操作。
5) 在非高峰期间执行长时间运行的查询或事务。
6) 确保开发人员使用限制最少的锁模式比不过仔细设计防止锁争用的事务,
7) 监控阻塞其他锁的锁并调查为什么这些锁正被保持。
8) 确定为什么阻塞的锁的被保持了很长时间并尽量阻止它们。
9) 监视死锁发生的频率并解决它们。
10) 当死锁发生通过回滚事务rollback或者终止会话来解决它。
SQL SERVER :
SQL SERVER能够自动探测和处理死锁,但应用程序应尽可能的避免,遵循如下原则:
1) 从表中访问数据的顺序要一致,避免循环死锁。
2) 减少使用holdlock或使用可重复读与可序列化锁隔离级的查询,从而避免转换死锁。
3) 恰当选择事务隔离级别。选择低事务隔离级可以减少死锁。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››oracle 中 UPDATE nowait 的使用方法
- ››Oracle ORA-12560解决方法
- ››Oracle 10g RAC 常用维护命令
- ››Oracle如何在ASM中定位文件的分布
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Oracle的DBMS_RANDOM.STRING 的用法
- ››oracle 外部表导入时间日期类型数据,多字段导入
赞助商链接