数据库访问中的锁定策略
2009-10-21 00:00:00 来源:WEB开发网乐观事务锁定
与悲观锁定方案不同,应用程序显式地锁定需要更新的数据行,在乐观锁定中只有在更新数据行时才由数据库管理器进行实际的锁定。应用程序使用通常不带 FOR UPDATE 子句的 SQL SELECT 语句读取要更新的数据行。更改数据后,重新写入相应的行。通过在某些方面严格限定这些更新,以确保只有那些处于最初读取状态的数据行才更新。这可以通过使用数据行中包含的时间戳或序列号来进行,也可将数据行的每个列字段添加到 UPDATE 的 WHERE 子句中。推荐使用前面两种方法,第三种选择的效率不是很高。此外,某些列,如 BLOB 类型,不适用于这种严格限定的更新。应注意,某些 OR 映射工具(例如实体 Bean)会使用这种严格限定的更新。
如果在单条 SQL UPDATE 语句中更新多行记录,则很难知道哪些数据行更新成功以及哪些更新失败,因此乐观锁定应只适用于处理 UPDATE 语句中的单个数据行,而不是多个数据行。不过,您可以使用乐观锁定技术循环访问一组行并单独更新每个数据行。
乐观事务锁定通常以其高性能和死锁发生可能性较低的特点而被首选使用。但是,在实际使用中应根据具体情况进行分析,有时也需要悲观锁定方案。如果乐观锁异常会引起大量的回滚,那么应该重新考虑您的策略。
即使在乐观锁定方案中,在事务结束(提交时)之前物理锁仍然会保持在更新的数据行上,因此建议在更新数据库之后应尽快完成事务。
会话锁定选项
会话锁是指那些跨越多个工作事务单元的锁,它们涵盖某些业务流程的整个持续期间。这一部分讨论使用会话锁定的乐观和悲观方法的具体内容及其优缺点。
乐观会话锁定
在此方案中,用户从数据库中检索数据而不加任何锁。检索的数据中包含可使用户能判断数据库中的记录行将来是否更改的足够信息,这可通过使用表中的时间戳或序列号,或以最初读取访问的每个数据元素值来进行保存得以实现。用户可以查看数据并进行更改,然后调用事务来提交这些更改。
更多精彩
赞助商链接