WEB开发网
开发学院数据库Oracle SQL Server和Oracle中的锁和死锁 阅读

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#为

当我们查询到死锁的进程的信息可以使用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的活动监视器浏览锁的页面,如下图:

SQL Server和Oracle中的锁和死锁 

这个列表返回的信息和使用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) 恰当选择事务隔离级别。选择低事务隔离级可以减少死锁。

上一页  1 2 3 4 5 6 

Tags:SQL Server Oracle

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接