上一节已经介绍了丢失更新问题,如何解决这个问题有两种机制:悲观锁定和乐观锁定。这一节介绍悲观锁定。
用户在屏幕上修改值之前,这个锁定方法就要起作用。例如,用户一旦有意对他选择的某个特定行(屏幕上可见)执行更新,如单击屏幕上的一个按钮,就会放上一个行锁。也就是说,当用户点击界面上修改按钮的时候,就应该给要修改的那一条记录加一个行锁。
只要用户从数据库取出一条记录,准备更新,就给这条记录加一个行锁。因为我很悲观,我不知道用户是否会更改这条记录。
打个比方:后台管理员1查询用户信息,单击某一个用户信息想对他进行修改。这个时候的SQL语句应该是这样的:
select * from t_user_info where userId=**** for update nowait。 后面的for update nowait语句就给这一行加了一个行锁,任何用户只能够查看这个用户的信息,而不能够进行修改。当这条语句到达数据库执行的时候会遇到这几种情况:
1. 还没有人对这位用户的记录加行锁,后台管理员1加锁成功!
2. 已经有人对这位用户的记录加了行锁,后台管理员1加锁失败,我们就会得到一个ORA-00054:resource busy(ORA-00054:资源忙)错误。相应地,必须等待更新这一行的用户执行工作。
oracle9i&10g编程艺术书中还说了一种情况(我认为不会发生):
在选择数据和指定有意更新之间,如果有人已经修改了这一行,我们就会得到0行。这说明,屏幕上的数据是过时的。为了避免前面所述的丢失更新情况,应用需要重新查询(requery),并在允许在最终用户修改之前锁定数据。
不知作者是否是这个意思,当点击某个用户要更新该用户数据的时候,不从数据库重新读取该用户数据,只是对该用户数据是否已经修改了进行判断。如果已经修改则返回一个已修改标识,说明我们以前读取的该用户数据已经无效,反之,则有效。如果无效,则重新读取该用户数据。那样的话岂不是很麻烦,需要把我们先前读取的该用户所有数据都传进去,与数据库中该用户的数据进行比对。那何不就重新读取该用户的数据呢?不知大家怎么理解?
注:oracle9i&10g编程与艺术。
分享到:
相关推荐
什么是锁? 锁定问题 丢失更新 悲观锁定 乐观锁定 乐观锁定还是悲观锁定? 阻塞 死锁 锁升级
- **共享更新锁(S/Row X)**:与共享锁类似,但允许锁定行进行修改。 2. **锁定级别**: - **ROW LEVEL LOCKS**:锁定特定行。 - **TABLE LOCKS**:锁定整个表。 - **DATABASE LOCKS**:锁定整个数据库。 3. **...
章节聚焦于Oracle中的锁机制,解释了锁定问题,如丢失更新、悲观锁定与乐观锁定、阻塞和死锁,以及锁升级的过程。进一步分析了DML锁、DDL锁和闩锁的不同类型,以及如何手动锁定和实现用户定义锁,为解决并发问题提供...
- **锁机制**:解释锁的定义和锁定问题,如丢失更新、悲观锁定、乐观锁定、阻塞和死锁。 - **锁类型**:详述DML锁、DDL锁、闩锁、手动锁定和用户定义锁的特点和应用场景。 - **并发控制**:探讨事务隔离级别的选择,...
- **锁定问题**:如丢失更新、悲观锁定、乐观锁定等。 - **锁类型**:包括DML锁、DDL锁、闩锁等。 #### 八、并发与多版本 - **并发控制**:介绍事务隔离级别的概念,包括READ UNCOMMITTED、READ COMMITTED等。 - **...
避免死锁的最佳实践包括合理设计事务大小,避免长时间的事务,及时释放不需要的锁,以及使用乐观锁定代替悲观锁定。 22. Oracle中的备份和恢复策略有哪些? 备份和恢复策略包括全库备份、数据文件备份、控制文件...
1. **悲观锁定**:这种方法假设数据可能在任何时刻被其他会话修改。因此,在更新数据前,会话将锁定相关行,以确保数据在其修改过程中不被其他人改变。这通常通过`SELECT...FOR UPDATE NOWAIT`语句实现,该语句会在...
本章详细分析了锁的概念、类型(如DML锁、DDL锁、闩锁)以及锁定策略(乐观锁定与悲观锁定)。还探讨了锁定可能导致的问题,如丢失更新、阻塞、死锁和锁升级,帮助读者设计更加健壮的并发控制方案。 ### 第7章:...
如果一个事务在执行过程中断开连接,那么与这个事务相关的资源(包括锁定)将保持不变,直到Oracle系统手动干预。 要查询被锁定的表,可以使用以下SQL语句: ```sql SELECT object_name, machine, s.sid, s.serial...
- **锁定问题**:讨论了丢失更新、悲观锁定、乐观锁定等常见问题及其解决方案。 - **锁类型**:介绍了DML锁、DDL锁、闩等不同类型的锁及其应用场景。 ##### 第7章 并发与多版本 - **并发控制**:阐述了并发控制的...