丢失更新(lost update)是一个经典的数据库问题。实际上,所有多用户计算机环境都存在这个问题。简单地说,出现下面的情况时(按以下所列的顺序),就会发生丢失更新:
(1) 会话Session1中的一个事务获取(查询)一行数据,放入本地内存,并显示给一个最终用户User1。
(2) 会话Session2中的另一个事务也获取这一行,但是将数据显示给另一个最终用户User2。
(3) User1使用应用修改了这一行,让应用更新数据库并提交。会话Session1的事务现在已经执行。
(4) User2也修改这一行,让应用更新数据库并提交。会话Session2的事务现在已经执行。
这个过程称为“丢失更新”,因为第(3)步所做的所有修改都会丢失。例如,请考虑一个员工更新屏幕,这里允许用户修改地址、工作电话号码等信息。应用本身非常简单:只有一个很小的搜索屏幕要生成一个员工列表,然后可以搜索各位员工的详细信息。这应该只是小菜一碟。所以,编写应用程序时没有考虑锁定,只是简单的SELECT和UPDATE命令。
然后最终用户(User1)转向详细信息屏幕,在屏幕上修改一个地址,单击Save(保存)按钮,得到提示信息称更新成功。还不错,但是等到User1第二天要发出一个税表时,再来检查记录,会发现所列的还是原先的地址。到底出了什么问题?很遗憾,发生这种情况太容易了。在这种情况下,User1查询记录后,紧接着另一位最终用户(User2)也查询了同一条记录;也就是说,在User1读取数据之后,但在她修改数据之前,User2也读取了这个数据。然后,在User2查询数据之后,User1执行了更新,接到成功信息,甚至还可能再次查询看看是否已经修改。不过,接下来User2更新了工作电话号码字段,并单击Save(保存)按钮,完全不知道他已经用旧数据重写(覆盖)了User1对地址字段的修改!之所以会造成这种情况,这是因为应用开发人员编写的程序是这样的:更新一个特定的字段时,该记录的所有字段都会“刷新”(只是因为更新所有列更容易,这样就不用先得出哪些列已经修改,并且只更新那些修改过的列)。
可以注意到,要想发生这种情况,User1和User2甚至不用同时处理记录。他们只要在大致同一时间处理这个记录就会造成丢失更新。
我发现,如果GUI程序员在数据库方面的培训很少(或者没有),编写数据库应用程序时就时常会冒出这个数据库问题。这些程序员了解了如何使用SELECT、INSERT、UPDATE和DELETE等语句后,就着手开始编写应用程序。如果开发出来的应用程序有上述表现,就会让用户完全失去对它的信心,特别是这种现象只是随机地、零星地出现,而且在受控环境中完全不可再生(这就导致开发人员误以为是用户的错误)。
注:《oracle9i&10g编程艺术》阅读笔记
分享到:
相关推荐
- **共享更新锁(S/Row X)**:与共享锁类似,但允许锁定行进行修改。 2. **锁定级别**: - **ROW LEVEL LOCKS**:锁定特定行。 - **TABLE LOCKS**:锁定整个表。 - **DATABASE LOCKS**:锁定整个数据库。 3. **...
在Oracle数据库管理中,"快速查找Oracle锁对象"是一个关键任务,特别是在处理并发事务和解决性能问题时。当多个用户或进程同时访问同一资源时,可能会出现锁冲突,导致某些事务等待,影响数据库的正常运行。了解如何...
在Oracle数据库管理中,锁机制是用于控制并发访问的重要手段之一。然而,在某些情况下,不当的锁可能会导致性能问题甚至系统故障,因此掌握如何解锁变得至关重要。本文将详细介绍Oracle解锁方法的相关知识点,包括...
### Oracle锁机制详解 #### 锁的基本概念与作用 锁机制是Oracle数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下...
#### 一、Oracle锁机制简介 在Oracle数据库中,锁是用来控制多个用户对同一数据资源访问的一种机制,目的是为了防止并发操作导致的数据不一致问题。锁分为多种类型,包括行级锁、表级锁等,每种锁都有其特定的应用...
Oracle事务与锁定是数据库管理系统中的核心概念,它们对于确保数据的完整性和一致性至关重要。事务是数据库操作的基本单元,它封装了一系列的数据库操作,确保这些操作要么全部成功,要么全部失败,从而保持数据库的...
### Oracle锁表查询知识点 #### 一、Oracle锁机制简介 在Oracle数据库中,为了确保数据的一致性和并发性,采用了一种称为“锁”的机制来控制对数据资源的访问。锁可以防止多个用户同时修改同一数据,从而避免数据...
Oracle监听配置文件是数据库系统中至关重要的组成部分,它管理着客户端与服务器之间的通信。本文将深入探讨Oracle监听配置文件,包括锁的查看和解除方法,以及相关的核心配置文件:listener.ora、sqlnet.ora和...
在Oracle数据库管理与维护的过程中,遇到“由于对象被锁住无法编译处理”的问题是非常常见的。这种情况主要发生在当Oracle中的包、函数或过程正在被某个会话调用时,如果尝试对这些对象进行编译或者结构上的修改,就...
在Oracle数据库管理中,解锁资源和查询...然而,这些操作应谨慎进行,特别是在生产环境中,因为错误的命令可能会导致数据丢失或服务中断。因此,在执行任何可能导致重大变化的命令之前,建议先在测试环境中验证其效果。
什么是锁? 锁定问题 丢失更新 悲观锁定 乐观锁定 乐观锁定还是悲观锁定? 阻塞 死锁 锁升级
在Oracle数据库管理系统中,"查询Oracle锁"是一项关键任务,用于诊断和解决并发操作中的阻塞问题。当多个事务尝试同时访问同一资源时,可能会发生锁冲突,导致某些事务等待其他事务完成。了解如何查询并分析这些锁...
本文将深入探讨Oracle中的表锁机制,包括如何识别锁定的表,理解不同类型的锁,以及如何采取措施解除锁定状态。 ### Oracle表锁的概念 在Oracle数据库中,锁是一种机制,用于控制对数据资源的并发访问,防止多个...
本文将深入探讨Oracle中的表锁定与解锁,以及如何解决相关的锁等待问题。 首先,了解Oracle中的锁类型至关重要。主要分为两种基本类型的锁:行级锁(TX,Row Lock)和表级锁(TM,Table Lock)。行级锁用于锁定单个...
例如,两个用户同时尝试更新同一条记录,如果没有适当的锁机制,可能会导致其中一个用户的更改被另一个用户的更改覆盖,从而丢失数据。因此,锁是并发控制的核心组成部分。 #### 三、Oracle中的锁分类 Oracle中的锁...
* 杀死锁定的会话和操作系统进程可能会导致数据丢失,需要小心操作。 * 死锁问题可能是由于数据库设计的缺陷或应用程序的 Bug 导致的,需要对数据库和应用程序进行优化和改进。 解决 Oracle 杀死死锁进程需要具备...
并发控制通过锁机制来防止事务间的异常情况,如丢失更新、脏读、不可重复读和幻读。锁主要有两种类型:排它锁(X锁)和共享锁(S锁)。X锁不允许其他事务对锁定资源进行任何操作,而S锁仅允许读取,不允许修改。 2....
10. **数据库故障排查**:教授如何识别和解决Oracle常见的错误和问题,如日志文件丢失、锁等待和内存管理等。 11. **数据库服务与网络配置**:讲解监听器、网络服务名和连接字符串的设置,确保数据库服务能够正常...
Oracle提供了多种类型的锁,包括DDL锁、DML锁和内部锁。DDL锁是在执行数据库定义语言(DDL)如CREATE、ALTER或DROP等命令时自动施加和释放的,主要用于保护数据结构的完整性。DML锁则是在事务开始时设置,并在事务...
### Oracle查看被锁的表与解锁方法 在Oracle数据库管理及开发过程中,有时会遇到表被锁的问题,这种情况可能会导致应用程序出现性能瓶颈甚至完全无法执行某些操作。因此,掌握如何查看哪些表被锁以及如何解锁变得尤...