数据库访问中的锁定策略
2009-10-21 00:00:00 来源:WEB开发网核心提示: 另一种乐观方法则不锁定任何数据,而是维护正在使用的数据的相关信息,数据库访问中的锁定策略(2),这样就可以在用户会话期间得知数据是否已被更改(例如,通过保存数据行的时间戳或序列号信息),这时,可能需要修改应用程序,如果应用程序在更新时看到该值已经更改,则不会进行更新
另一种乐观方法则不锁定任何数据,而是维护正在使用的数据的相关信息,这样就可以在用户会话期间得知数据是否已被更改(例如,通过保存数据行的时间戳或序列号信息)。如果应用程序在更新时看到该值已经更改,则不会进行更新,并通知用户需要重试其操作。
在使用悲观会话锁定中需要注意一些问题,例如清理废弃的锁等,这将在稍后进行介绍。
事务锁定选项
事务锁(数据库锁)是单个事务工作单元内出现的锁。这一部分讨论使用数据库锁定的乐观和悲观方法的优点及缺点。
悲观事务锁定
在悲观锁定方案中,通过使用 SQL SELECT FOR UPDATE 语句对数据行进行显式锁定,然后更改数据,并执行 SQL UPDATE。在这种情况下,显然所有数据行都能成功地更新,因为它们在其他更新尝试之前已被物理锁定。直到事务提交之后,这些锁才会被解除。同乐观锁定策略相比,物理数据库锁需要持续较长的时间,因此应用程序性能和吞吐量很可能会受到影响。同时,还可能出现死锁的情况。可以使用尽量低的隔离级别(将在稍后讨论),并且始终按相同顺序访问数据库表以及在获取锁之前执行尽量多的业务处理,以便缩短锁持续时间,从而减少死锁问题,死锁还可能在锁升级时出现,即如果同时保持的锁过多,可能引起数据库管理器将行级锁更改成页级锁甚至表级锁。再次强调,缩短锁的生存期非常重要。
进行特定的关键性更新时,应始终使用悲观锁定方式。例如,在从主键序列表中检索并缓存下一批可用的键值时。在短时间的事务中很少使用该操作,因为此操作会导致更新失败的风险。
需要注意的是,在某些情况下给定的 SELECT 语句不能使用 FOR UPDATE 子句。这时,可能需要修改应用程序,或使用乐观锁定方式。
更多精彩
赞助商链接