数据库访问中的锁定策略
2009-10-21 00:00:00 来源:WEB开发网核心提示:引言作为多用户应用程序开发人员所面临的最为复杂的领域之一,基于服务器的系统必须处理好锁定策略的影响,数据库访问中的锁定策略,如果实现得不好,将导致包括性能问题、死锁以及异常的应用程序行为等各类问题,用于阻止访问业务事务中使用的某行(或多行)数据,这些数据可被“锁定”一段时间,本文的目的在于列出基
引言
作为多用户应用程序开发人员所面临的最为复杂的领域之一,基于服务器的系统必须处理好锁定策略的影响。如果实现得不好,将导致包括性能问题、死锁以及异常的应用程序行为等各类问题。本文的目的在于列出基本问题、常用策略和模式以及有关使用锁定策略的时机和方法的一般性建议。
本文假设开发人员已经掌握所使用的 SQL,因而不会全面介绍使用对象关系(Object Relational,OR)映射工具的复杂细节。
事务锁定与会话锁定
数据库管理系统在事务范围之内提供锁定机制。采用读取或更新锁可防止应用程序的不一致行为;锁的实际使用取决于开发人员使用的 SQL 语句类型以及在数据库连接中指定的隔离级别。但是,仅仅依靠数据库本身的锁定是不够的。在某些场景中,可能需要长时间的“逻辑锁”以防止对某个用户正在使用的数据进行更改。以下将称之为会话锁定,以区别于仅存在于事务范围内的显式数据库锁定功能,而后者则被称为事务锁定。
带用户界面的系统中的会话锁定通常是用于解决众所周知的“居间更新”问题,在这种情况下,用户读取一条记录,更改并更新数据库,但另一个用户也在同时读取相同记录并进行更改。在此场景中,其中一个用户所做的更改将丢失。这也适用于基于消息的系统中,其中有多个更新需要提交,并且提交的顺序非常重要。必须注意,这是通过约定锁定,因此并不存在物理锁,其解决方法取决于对应用程序的理解和锁定策略的选用。
有两种常用方法来处理这种问题。一种是使用逻辑锁的悲观方法,由所有可能访问数据的应用程序理解并遵从,用于阻止访问业务事务中使用的某行(或多行)数据。这些数据可被“锁定”一段时间,因此使用时需谨慎。
更多精彩
赞助商链接