上一节介绍了oracle丢失更新问题的一种解决方法:悲观锁定,这一节将介绍乐观锁定。
乐观锁定,即把所有锁定都延迟到即将执行更新之前才做。换句话说,我们会修改屏幕上的信息而不要锁。我们很乐观,认为数据不会被其他用户修改;因此,会等到最后一刻才去看我们的想法对不对。总之,就是当用户已经填好修改内容,点击修改按钮的时候,我们才去给要修改的记录加锁。
这种锁定方法在所有环境下都行得通,但是采用这种方法的话,执行更新的用户“失败”的可能性会加大。这说明,这个用户要更新他的数据行时,发现数据已经修改过,所以他必须从头再来。
实现乐观并发控制的方法有很多种。我们将介绍三种方法,分别是:
1. 使用一个特殊的列,这个列由一个数据库触发器或应用程序代码维护,可以告诉我们记录的“版本”.
2. 使用一个校验和或散列值,这是使用原来的数据计算得出的.
3. 使用新增的Oracle 10g 特性ORA_ROWSCN.
下面介绍第一种方法:
这是一个简单的实现,如果你想保护数据库表不出现丢失更新问题,应对每个要保护的表增加一列。这一列一般是NUMBER或DATE/TIMESTAMP列,通常通过表上的一个行触发器来维护。每次修改行时,这个触发器要负责递增NUMBER列中的值,或者更新DATE/TIMESTAMP列。用户每次进行修改的时候,会拿自己取出的这一列的值与数据库中的进行比较,如果相同,说明还没有人修改过,反之,则已经修改过了!
其实,,对于这么简单的工作,建议还是避免使用触发器,而让DML来负责。触发器会引入大量开销,而且在这种情况下没有必要使用它们。
但是,也不能总是依赖各个应用来维护这个字段,原因是多方面的。例如,这样会增加应用程序代码,而且只要是表中需要修改的地方,都必须重复这些代码,并正确地实现。 在一个大型应用中,这样的地方可能很多。另外,将来开发的每个应用也必须遵循这些规则。应用程序代码中很可能会“遗漏”某一处,未能适当地使用这个字段。 因此,如果应用程序代码本身不负责维护这个LAST_MOD字段,我相信应用也不应负责检查这个LAST_MOD字 段(如果它确实能执行检查,当然也能执行更新!)。所以在这种情况下,我建议把更新逻辑封装到一个存储过程中,而不要让应用直接更新表。如果无法相信应用 能维护这个字段的值,那么也无法相信它能正确地检查这个字段。存储过程可以取以上更新中使用的绑定变量作为输入,执行同样的更新。当检测到更新了0行时,存储过程会向客户返回一个异常,让客户知道更新实际上失败了。
个人感觉还是太麻烦,且看下面还有两个方法!
注:oracle9i&10编程艺术阅读笔记
分享到:
相关推荐
什么是锁? 锁定问题 丢失更新 悲观锁定 乐观锁定 乐观锁定还是悲观锁定? 阻塞 死锁 锁升级
- **共享更新锁(S/Row X)**:与共享锁类似,但允许锁定行进行修改。 2. **锁定级别**: - **ROW LEVEL LOCKS**:锁定特定行。 - **TABLE LOCKS**:锁定整个表。 - **DATABASE LOCKS**:锁定整个数据库。 3. **...
2. **乐观锁定**:相比之下,乐观锁定假设数据不太可能在修改过程中被其他会话更改。因此,它允许并发会话在没有锁定的情况下修改数据。然而,在实际更新时,会检查数据自上次读取以来是否已被修改。有几种实现乐观...
- **锁机制**:解释锁的定义和锁定问题,如丢失更新、悲观锁定、乐观锁定、阻塞和死锁。 - **锁类型**:详述DML锁、DDL锁、闩锁、手动锁定和用户定义锁的特点和应用场景。 - **并发控制**:探讨事务隔离级别的选择,...
避免死锁的最佳实践包括合理设计事务大小,避免长时间的事务,及时释放不需要的锁,以及使用乐观锁定代替悲观锁定。 22. Oracle中的备份和恢复策略有哪些? 备份和恢复策略包括全库备份、数据文件备份、控制文件...
- **锁定问题**:如丢失更新、悲观锁定、乐观锁定等。 - **锁类型**:包括DML锁、DDL锁、闩锁等。 #### 八、并发与多版本 - **并发控制**:介绍事务隔离级别的概念,包括READ UNCOMMITTED、READ COMMITTED等。 - **...
4. **并发控制**:由于多用户可能同时访问数据库,Oracle通过锁定机制和乐观锁策略防止数据冲突。在ATM系统中,需要合理设置锁粒度,以平衡并发性能和数据一致性。 5. **安全性与权限管理**:Oracle数据库提供严格...
如果一个事务在执行过程中断开连接,那么与这个事务相关的资源(包括锁定)将保持不变,直到Oracle系统手动干预。 要查询被锁定的表,可以使用以下SQL语句: ```sql SELECT object_name, machine, s.sid, s.serial...
- **锁定问题**:讨论了丢失更新、悲观锁定、乐观锁定等常见问题及其解决方案。 - **锁类型**:介绍了DML锁、DDL锁、闩等不同类型的锁及其应用场景。 ##### 第7章 并发与多版本 - **并发控制**:阐述了并发控制的...
Oracle数据库在运行过程中,有时会出现表被锁定的情况,这可能是由于事务处理未完成、死锁或其他原因导致的。本文将详细介绍如何解锁Oracle表,并提供相关的SQL命令和步骤。 首先,了解Oracle表锁定的原因是必要的...
在某些情况下,可能需要通过锁定策略、乐观锁或悲观锁等手段来进一步控制并发行为,以满足特定应用的需求。此外,理解并正确处理并发问题,如死锁(deadlock)和活锁(livelock),也是确保数据库系统稳定运行的重要...
Oracle还提供了乐观锁和悲观锁策略,根据应用场景选择合适的锁类型。 八、备份与恢复 Oracle提供多种备份策略,如完整备份、增量备份和差异备份。恢复技术包括还原到特定时间点、介质恢复和归档日志恢复,确保在...
在多用户环境中,Oracle提供了事务管理和并发控制机制,如行级锁定和乐观锁,确保数据的一致性和完整性。理解事务的ACID属性(原子性、一致性、隔离性和持久性),以及死锁的概念和解决策略,对于保证数据库系统的...