测试应用程序
为了测试应用程序,请编译它并运行它的两个实例。单击两个实例上的Fill按钮。在应用程序的第二个实例中,修改一个值并单击Update按钮。返回应用程序的第一个实例,编辑一个不同的字段来更改相同的记录,再单击Update按钮。
在应用程序的第一个实例中进行的更新将会成功,因为它持有记录锁。第二个实例只是显示一条错误消息,表明它成为死锁情况下的牺牲品。还可启动应用程序,单击Fill按钮,再尝试用另一种方法来更新记录,比如使用SQL Server的Query Analyzer。只要Fill按钮是在Query Analyzer运行一个SQL查询之前单击的,Query Analyzer就会被迫等待,在锁被移除之后才能执行查询。
一些警告
如前所述,考虑到性能,通常应尽量避免悲观锁定。但某些情况下,却可能需要它。如同本文所展示的,在ADO.NET中执行悲观锁定的代码是相当简洁的。
如果必须使用悲观锁定,应尝试快速更新记录并结束打开的事务处理,保证记录锁只存在尽可能短的时间。任何情况下,都不应在事务处理打开的同时,等待来自用户的某些操作。本文的示范应用程序之所以违反了这一规则,只是为了演示之用途。用户极有可能在更新途中离开计算机,让记录锁定数小时乃至数天之久。相反,应该以程序化的方式,在单独一个步骤中,让更新从记录中将锁移除。
