|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:serverSQLServer数据库产生逝世锁时不会像ORACLE那样主动天生一个跟踪文件。偶然能够在[办理]->[以后举动]里看到堵塞信息(偶然SQLServer企业办理器会由于锁太多而没有呼应). 设定跟踪1204:
USEMASTER
DBCCTRACEON(1204,-1)
显现以后启用的一切跟踪标志的形态:
DBCCTRACESTATUS(-1)
作废跟踪1204:
DBCCTRACEOFF(1204,-1)
在设定跟踪1204后,会在数据库的日记文件里显现SQLServer数据库逝世锁时一些信息。但那些信息很丢脸懂,必要对比SQLServer联机丛书细心来看。依据PAG锁要找到相干数据库表的办法:
DBCCTRACEON(3604)
DBCCPAGE(db_id,file_id,page_no)
DBCCTRACEOFF(3604)
请参考sqlservercentral.com上更具体的解说.但又从CSDN学到了一个找到逝世锁缘故原由的办法。我略加修正,往失落了游标操纵并增添了一些提醒信息,写了一个体系存储历程sp_who_lock.sql。代码以下:
ifexists(select*fromdbo.sysobjects
whereid=object_id(N[dbo].[sp_who_lock])
andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[sp_who_lock]
GO
/********************************************************
//进修到并改写
//申明:检察数据库里堵塞和逝世锁情形
********************************************************/
usemaster
go
createproceduresp_who_lock
as
begin
declare@spidint,@blint,
@intTransactionCountOnEntryint,
@intRowcountint,
@intCountPropertiesint,
@intCounterint
createtable#tmp_lock_who(
idintidentity(1,1),
spidsmallint,
blsmallint)
IF@@ERROR0RETURN@@ERROR
insertinto#tmp_lock_who(spid,bl)select0,blocked
from(select*fromsysprocesseswhereblocked>0)a
wherenotexists(select*from(select*fromsysprocesses
whereblocked>0)b
wherea.blocked=spid)
unionselectspid,blockedfromsysprocesseswhereblocked>0
IF@@ERROR0RETURN@@ERROR
--找光临时表的纪录数
select@intCountProperties=Count(*),@intCounter=1
from#tmp_lock_who
IF@@ERROR0RETURN@@ERROR
if@intCountProperties=0
select如今没有堵塞和逝世锁信息asmessage
--轮回入手下手
while@intCounter<=@intCountProperties
begin
--取第一笔记录
select@spid=spid,@bl=bl
from#tmp_lock_whowhereId=@intCounter
begin
if@spid=0
select引发数据库逝世锁的是:+CAST(@blASVARCHAR(10))
+历程号,其实行的SQL语法以下
else
select历程号SPID:+CAST(@spidASVARCHAR(10))+被
+历程号SPID:+CAST(@blASVARCHAR(10))+堵塞,其以后历程实行的SQL语法以下
DBCCINPUTBUFFER(@bl)
end
--轮回指针下移
set@intCounter=@intCounter+1
end
droptable#tmp_lock_who
return0
end
必要的时分间接挪用:
sp_who_lock
就能够查出引发逝世锁的历程和SQL语句.
SQLServer自带的体系存储历程sp_who和sp_lock也能够用来查找堵塞和逝世锁,但没有这里先容的办法好用。假如想晓得别的tracenum参数的寄义,请看http://www.sqlservercentral.com/文章
我们还能够设置锁的超不时间(单元是毫秒),来延长逝世锁大概影响的工夫局限:
比方:
usemaster
seelct@@lock_timeout
setlock_timeout900000
--15分钟
seelct@@lock_timeout
MyISAMMysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务 |
|