RSS 2.0 Feed
2007-05 Entries
摘要:今天早上我在处理一个数据库死锁的异常时候,怡红公子给我的其中一个建议就是使用 NOLOCK 或者 READPAST 。我在使用后特整理有关 NOLOCK 和 READPAST的一些技术知识点到本篇博客: 对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问题。 NOLOCK 和 READPAST 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。但是这时候一定要注意NOLOCK 和 READPAST的局限性,确认你的业务逻辑可以容忍这些记录的出现或者不出现:   简单来说: NOLOCK 可能把没有提交事务的数据也显示出来. READPAST 会把被锁住的行不显示出来  不使用 NOLOCK 和 READPAST ,在 Select 操作时候则有可能报错误:事务(进程 ID **)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。   下面就来演示这个情况。 为了演示两个事务死锁的情况,我们下面的测试都需要在SQL Server Management Studio中打开两个查询窗口。保证事务不被干扰。   演示一 没有提交的事务,NOLOCK 和 READPAST处理的策略: 查询窗口一请执行如下脚本: CREATE TABLE t1 (c1 int IDENTITY(1,1), c2 int)go BEGIN TRANSACTIONinsert t1(c2) values(1)   在查询窗口一执行后,查询窗口二执行如下脚本: select count(*) from t1 WITH(NOLOCK)select count(*) from t1 WITH(READPAST)   结果与分析: 查询窗口二依次显示统计结果为: 1、0 查询窗口一的命令没有提交事务,所以 READPAST 不会计算没有提交事务的这一条记录,这一条被锁住了,READPAST 看不到;而NOLOCK则可以看到被锁住的这一条记录。   如果这时候我们在查询窗口二中执行: select count(*) from t1 就会看到这个执行很久不能执行完毕,因为这个查询遇到了一个死锁。   清除掉这个测试环境,需要在查询窗口一中再执行如下语句: ROLLBACK TRANSACTIONdrop table t1   演示二:对被锁住的记录,NOLOCK 和 READPAST处理的策略   这个演示同样需要两个查询窗口。 请在查询窗口一中执行如下语句: CREATE TABLE t2 (UserID int , NickName nvarchar(50))goinsert t2(UserID,NickName)......[阅读全文]

posted @ | Feedback (8) | Filed Under [ 数据库开发管理心得 ]

摘要: 隐式类型变量 (Implicitly typed local variables) 象下面的代码书写就是隐式类型变量 var i = 5;var str = “Csharp”var numbers = new int[]{1,2,3};var orders = new System.Collections.Hashtable();var orders1 = new Dictionary<Guid,object>(); var i = xxx ; 的作用就是用 xxx 的类型声明为i的类型。并给i 赋值。由于声明时候,需要依赖于等号右边的表达式,所以必须同时赋值。否则下面的书写就会报错误: Error Implicitly typed locals must be initialized var gg; 使用 Implicitly typed local variables 时应遵守下列约束:1. The declarator must include an initializer 声明时必须包含初始化器。 2、The initializer must be an expression. The initializer cannot be an object or collection initializer by itself, but it can be a new expression that includes an object or collection initializer.初始化必须是一个表达式。初始化表达式不能包含它自身,但是可以是包含一个对象或集合初始化器的一个new表达式(即匿名类型)。 3、The compile-time type of the initializer......[阅读全文]

posted @ | Feedback (11) | Filed Under [ .net 编程心得 .net 3.5 ]

摘要:很多程序员不习惯写注释。甚至是一些比较底层的函数都不写注释。过一段时间后调用时候,就不得不去查看实现代码,才能知道某个边界值的判断是否在函数实现中判断了。 如果手工检查是否写注释的话,很多时候因为工作一忙,就走与形式了。 前几天我的同事说在VS2005中找到的一个超简单的方式来强制写注释,如果公共函数没有写注释,或者注视书写错误,编译程序的时候就会报警告。 这个设置就是我们很多人都知道的定义输出的XML 文档,参见下图:   比如我们下面的代码: public class Class1{ public void aa(){ } /// <summary>/// /// </summary>/// <param name="ff"></param>protected void bb(int dd){ } private void cc(){ } internal void dd(){ }} 就会报四个警告: 1、类没有写注释 2、公共函数 public void aa() 没有写注释 3、void bb(int dd) 这个函数注释中出现了不存在的参数 ff 4、void bb(int dd) 这个函数没有写 参数 dd 的注释。   通过上面一个简单的设置,就可以强制团队的成员写注释。...[阅读全文]

posted @ | Feedback (26) |

摘要:.Net Framework 3.0 中增加了一个命名空间:System.Speech 使用这个空间的类和方法,我们可以很方便的2行代码就可以让一段文本被读出来。 演示代码如下: using System.Speech.Synthesis; SpeechSynthesizer synth = new SpeechSynthesizer(); synth.Speak("Hello, world!你好么?"); 但是需要注意的事情是: WinXP 系统自带的底层Speech API  版本是:Microsoft Speech API 5.1 Vista 系统自带的底层Speech API 版本是:Microsoft Speech API 5.3 目前还没有看到可以在 WinXP 使用的 Microsoft Speech API 5.3。 而 Microsoft Speech API 5.1 只支持英文文本的读,而Microsoft Speech API 5.3 出了支持英文文本的读外,还支持中文文本的读。 Microsoft Speech API 5.3 并不会因为你装了 .Net FrameWork 3.0 或者 3.5  就会也把 Microsoft Speech API 5.3 装上去。 这样,我们在装了 .Net FrameWork 3.0 的 WinXP 电脑上运行上述两行代码,只要你的声卡设置正常,可以播放声音,你听到的Hello, world!这一句英文,听不到你好么这个中文。 同时上述代码并不会报任何错误以及抛异常。 如果你是在 Vista 电脑上运行上述代码,只要你的声卡设置正常,你则可以正常听到中文和英文。   参考资料: 深入探索 Vista 中新语音识别API All the Cool Developers use Speech APIs MSDN 关于Microsoft Speech API 5.3 的帮助...[阅读全文]

posted @ | Feedback (18) | Filed Under [ .net 编程心得 Vista 相关 .net 3.0 ]