google出来,读到一半才发现是两年前自己写的。呵呵,集中到这里吧!
1.oracle对一条sql语句的执行是怎么管理并发和恢复控制的?
一条符合语法的sql语句,定义了对数据库的操作。此操作执行的时刻,对应了数据库的一个数据状态。可以这样理解这个状态:到此执行时刻为止,没有任何数据库语句级操作正在并发执行;就是说实际上正在并发执行的多个语句级操作可以假定在此语句操作之后执行。这里强调语句级操作,是指如果一个事务包含多个操作语句,在此时刻实际已经执行了其中几个,此时刻也正在执行某一个语句,那么不能简单地认为前面几个执行的操作语句也还没发生,这是要看事务的隔离级别的,但是不管事务隔离级别是几级,语句级别上可以认为是序列执行的。
该sql语句的操作过程中认为此数据状态是保持不变的。当此操作执行结束时刻,才产生语句级数据状态影响。就是说,可能该语句同时更新了两行,但都用了同一个主键,则此时会导致违反唯一性约定而消除整个语句的影响,如果成功执行,但未必就在事务级别上影响数据状态,就是说如果所在事务回滚,此影响仍然被消除,不过正如前面所说,一个语句成功执行后,就可能影响其他语句所面对的数据状态。
2.PL/SQL的执行是怎么管理并发和恢复控制的?
PL/SQL是在一个PL/SQL引擎中执行的。该引擎可以认为是oracle之外的单位。该引擎会解析PL/SQL,并不断发送SQL语句给ORACLE。所以和用JAVA程序通过JDBC在一个会话连接中发送多个SQL语句没有本质差别。也因此并发和恢复管理没有不同。
3.oracle死锁是怎么样产生的?
由于oracle控制并发是使用的锁机制,也因此即会产生死锁问题。oracle在执行一个语句时,会根据语句的含义,同时根据所处的事务隔离级别,解析出需要加什么样的锁,什么时候释放。而隔离级别越高,对锁资源占用越大。现在考虑这样的情形,oracle同时处理两个事务A,B。A发过来几条语句,导致ORACLE加了几把锁没有释放,B发过来几条语句,导致ORACLE加了另外几把锁没有释放,现在,A又发过来一个语句,此语句要求ORACLE加的一些锁中,有几个锁已经被B事务占用,那么A等待,而B又发过来一条语句,此语句要求ORACLE加的锁,在A手中。于是死锁出现。而隔离级别越高,死锁的可能性越大。可以分析出来,死锁的根本原因在于,事务包含的语句是分条发给oracle的,oracle不能够在事务开始时刻就解析出全部执行过程需要什么锁,什么时候释放,无法统一安排。
死锁问题归咎由谁呢?我这么理解:如果没有事务概念,oracle在语句级上控制并发,完全不会出现死锁问题。因为在解析语句时,oracle已经知道要加多少把锁,它会看目前这些锁如果能全部获得就执行,否则就等待。可是实际应用怎么能没有事务的概念呢?我同意完全可以出现新的sql语法,可以把原来的多条sql语句的含义在一个语句中定义完毕,长短不是问题,牺牲一定的语法简洁度也不是问题;然而最关键的是往往我们是在一个业务处理逻辑中,多个数据库操作之间掺杂了其他非数据库操作,而又想获取这些数据库操作作为一个整体的ACID。因此事务概念必须存在。既然如此,或许我们真得可以把一个事务可能包含的语句在事务开始时就交给oracle,尽管这样一来,有可能就包含了实际通过业务逻辑判断不会执行的语句,导致oracle浪费锁,降低并发处理能力。
我之前的文章曾经介绍过用JAVA实现同步控制,降低ORACLE隔离级别,只利用ORACLE的原子性支持。这样做的原因就在上文中基本提到了。我们在编写JAVA业务逻辑时,是知道我们需要在一串业务逻辑中操作多少次数据库的,也因此,能够在业务逻辑开始时就控制得到所有的锁再执行。这样做确实能够降低oracle压力,并消除死锁问题,然而这样做会导致同步压力集中到JAVA应用端,而且对研发人员要求也会提高。尽管如此,在JAVA应用端使用同步要灵活很多,而不必限制在表锁行锁,你甚至可以建一个森林结构的信号量数据来控制同步。
呵呵,反过来也可以理解隔离级别的问题,为什么要存在允许幻像读的隔离级别呢?隔离级别的存在是一种权衡,如果应用既不想自己控制并发,又想提高并发能力,则需要好好权衡一下吧!
分享到:
相关推荐
### MySQL或Oracle通过ODBC与C#建立连接和进行事务处理 #### 一、概述 在现代企业级应用开发中,数据库的选择对于整个系统的稳定性和性能有着至关重要的影响。随着多语言开发的需求日益增长,如何让不同的编程语言...
总结而言,Oracle事务的完整流程包括客户端与服务端的连接、会话的建立、事务的执行以及事务的提交或回滚。在专用服务器模式下,每个用户进程都有自己的服务器进程,而在共享服务器模式下,多个用户共享一组服务器...
事务管理是数据库系统的核心功能之一。 #### 二、事务控制语句 ##### 1. COMMIT - **作用**:提交当前事务中的所有更改到数据库。 - **语法**: ```sql COMMIT; ``` - **示例**: ```sql SQL> insert into t1...
事务管理是确保数据一致性和完整性的重要手段之一,尤其是在涉及多条 SQL 语句或多张表的操作时。 #### 二、环境配置 在开始之前,我们需要确保开发环境正确配置了必要的组件和技术栈: - 操作系统:支持 Windows ...
Oracle 性能问题是数据库管理员和开发者经常遇到的一个棘手问题,本文总结了 Oracle 性能问题的解决方案,涵盖了物理模型优化、索引相关、SQL 相关、表设计和其他几个方面。 在物理模型优化方面,需要合理分配 SGA...
总结来说,Oracle事务是确保数据库操作正确性和一致性的基础,通过理解事务的特性、并发处理中的问题以及如何通过COMMIT和ROLLBACK进行控制,能够有效地维护数据库的稳定性和数据的准确性。在实际的数据库管理中,...
Oracle事务管理是确保数据一致性的重要机制,它允许数据库操作以原子性执行,即要么全部成功,要么全部失败。事务控制命令如`COMMIT`、`ROLLBACK`和`SAVEPOINT`为数据库操作提供了灵活的控制方式。死锁是并发事务中...
Oracle课程设计是一个重要的学习环节,尤其对于理解和掌握数据库管理系统的实际应用至关重要。在这个"满分Oracle课程设计-人事管理系统样例"中,我们可以深入探讨Oracle在构建企业级人事管理系统中的核心功能和应用...
### Oracle事务的核心特性详解 #### 一、引言 在Oracle数据库系统中,事务是数据库管理系统执行过程中的最小逻辑单元,它确保了数据处理的完整性和一致性。事务管理是数据库系统的重要组成部分,对于保证数据的...
总结起来,Oracle学生成绩管理系统结合了Oracle数据库的强大功能和教育管理的需求,不仅是一个实用的工具,也是学习数据库管理和软件开发的优秀实例。通过深入研究这个系统,可以提升对数据库设计、SQL编程、性能...
总结,PL/SQL是Oracle数据库管理中不可或缺的工具,它结合了SQL的查询能力与过程编程的灵活性,使得数据库管理员和开发人员能更有效地进行数据操作、事务管理和复杂逻辑处理。而Oracle提供的管理工具,如SQL ...
### 万能数据库查询分析器中的事务管理在Oracle中的应用 #### 一、引言 在数据库维护与管理过程中,经常需要对数据库记录进行修改或删除等操作。为了确保数据的安全性和一致性,这些操作通常是在一个事务中完成的...
【Java事务管理】Java事务管理是确保数据一致性的重要机制,主要涉及事务的概念、特性、以及在不同环境下的实现方式。事务是一组操作,遵循原子性、一致性、隔离性和持久性的原则,简称为ACID特性: 1. **原子性...
实验六主要涵盖了Oracle数据库中的模式对象管理和安全管理,旨在让学生深入理解和掌握相关操作。模式对象是数据库中的重要组成部分,包括表、视图、索引等,而安全管理则涉及到用户权限、角色以及权限的分配和回收。...
- 图书馆规模的扩大导致图书及相关信息量急剧增长,传统人工管理方式难以应对大规模信息处理的需求,容易出现管理混乱、资源浪费等问题。 - IT技术和互联网的发展促使信息管理方式发生变革,实现了自动化处理,提高...
为了解决这些问题,从Oracle 9.2.0版本开始,引入了自动段空间管理(Automatic Segment Space Management, ASSM),利用位图(Bitmap)技术替代原有的链表结构,从而在根本上提升了段存储空间的管理效率。...
总结来说,从普通Oracle DBA转型为Oracle Applications DBA意味着要扩展到应用程序层面,不仅关注数据库的健康,还要理解整个应用架构,处理更复杂的集成问题,具备一定的系统分析师能力。这一角色要求更高的技术...
总结来说,JAVA+ORACLE公交信息管理系统结合了JAVA的开发便捷性和ORACLE的数据处理优势,构建了一个高效、稳定的城市交通信息平台。通过对数据的实时管理和智能查询,极大地便利了公众的出行生活,也展示了信息技术...
在Oracle数据库管理中,遇到bug问题是在所难免的。这些问题可能涉及到性能、安全性、数据丢失或不一致等多方面,对于DBA(数据库管理员)来说,熟练掌握这些问题的解决方法至关重要。本篇将主要围绕Oracle数据库中...
总结,基于Oracle的运动会管理系统是一个实用性较强的项目,它融合了Oracle数据库和JSP技术,实现了多角色管理,并具有一定的扩展性。虽然界面有待提升,但其核心功能完备,对于学习和实践数据库管理和Web开发的人员...