仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 581|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL教程之SQL Server逝世锁的剖析

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务
简单生活 该用户已被删除
沙发
发表于 2015-1-24 14:22:13 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
乐观 该用户已被删除
板凳
发表于 2015-2-1 16:52:21 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
变相怪杰 该用户已被删除
地板
发表于 2015-2-7 10:11:36 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
蒙在股里 该用户已被删除
5#
发表于 2015-2-21 17:58:43 | 只看该作者
我们学到了什么?思考问题的时候从表的角度来思考问
小女巫 该用户已被删除
6#
发表于 2015-3-6 21:01:20 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
再见西城 该用户已被删除
7#
发表于 2015-3-13 09:09:39 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-20 18:40:24 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表