数据库访问中的锁定策略
2009-10-21 00:00:00 来源:WEB开发网在尝试提交更新时,应用程序将检查确认数据没有被其他用户更改。如果已更改,则更新将被拒绝,并通知用户已经发生居间更新。如果有多个数据行需要更新,则某些可能会更新成功,某些则会更新失败。一切由应用程序而不是数据库管理系统决定。该模式在 Martin Fowler 的著作Patterns of Enterprise Application Architecture 中描述为乐观离线锁(请参阅参考资料)。
在理论上,更新事务可以使用乐观或悲观锁定进行更新。但是,如果在整个会话期间可能出现居间更新,那么使用悲观事务锁定来更新单个数据行是没有任何价值的,这时使用乐观事务锁定方案就已足够,因为它基于数据初始访问时的数据行状态。
如果需要更新一系列的记录,且应用程序需要知道哪些行(如果有的话)发生了居间更新,那么就需要循环访问数据行,以确认所有行仍处于所要求的初始状态。如果要求要么全部更新、要么全部不更新数据行,则需要在实际进行更改之前使用 SELECT FOR UPDATE 来读取每一行(即对整个数据行集合使用悲观事务锁定),以防止结果不一致。
乐观会话锁定通常用在当多个并发用户很少有机会争用同一数据时。一个典型的例子是财务计划系统,每个财务顾问准确地拥有相应的帐户,并且某个顾问只能看到其所拥有的帐户。如果常常发生冲突,那么更新就会被拒绝,用户会对系统非常失望。缓解冲突问题的一种可能方法是将数据行标记为开放、可能更新。它较悲观会话锁更弱一些,相关方约定发出警告,而不是阻止。如果应用程序发现设置了警告标记,它将通知用户该数据已被使用,所做的任何更改可能都会丢失。然后,用户可以选择是否继续进行更新。
本例中的模式是当第一个事务读取某个数据行时,它将加上时间戳和用户标识,这类似于悲观会话锁定的处理方式(稍后讨论)。如果另外的事务检索数据并发现标记已被其他用户设置,那么它将按约定向用户发出数据正在被使用的警告消息。因此,第二个用户可以得知其所做更改可能会丢失,进而选择继续还是退回。
更多精彩
赞助商链接