ORACLE的隔离级别
作者: Parrotao
隔离级别(isolation level)
l 隔离级别定义了事务与事务之间的隔离程度。
l 隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
l ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:
l 未提交读(read uncommitted)
l 提交读(read committed)
l 重复读(repeatable read)
l 序列化(serializable)
l 通过一些现象,可以反映出隔离级别的效果。这些现象有:
l 更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。
l 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
l 非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data. )
l 幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition. )
l 下面是隔离级别及其对应的可能出现或不可能出现的现象
|
Dirty Read
|
NonRepeatable
Read
|
Phantom Read
|
Read uncommitted
|
possible
|
Possible
|
Possible
|
Read committed
|
Not possible
|
Possible
|
Possible
|
Repeatable read
|
Not possible
|
Not possible
|
Possible
|
Serializable
|
Not possible
|
Not possible
|
Not possible
|
ORACLE的隔离级别
l ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。
l read committed:
l 这是ORACLE缺省的事务隔离级别。
l 事务中的每一条语句都遵从语句级的读一致性。
l 保证不会脏读;但可能出现非重复读和幻像。
l serializable:
l 简单地说,serializable就是使事务看起来象是一个接着一个地顺序地执行。
l 仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。
l 保证不会出现非重复读和幻像。
l Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作。
l 如果有在serializable事务开始时未提交的事务在serializable事务结束之前修改了serializable事务将要修改的行并进行了提交,则serializable事务不会读到这些变更,因此发生无法序列化访问的错误。(换一种解释方法:只要在serializable事务开始到结束之间有其他事务对serializable事务要修改的东西进行了修改并提交了修改,则发生无法序列化访问的错误。)
l If a serializable transaction contains data manipulation language (DML) that attempts to update any resource that may have been updated in a transaction uncommitted at the start of the serializable transaction, (并且修改在后来被提交而没有回滚),then the DML statement fails. 返回的错误是ORA-08177: Cannot serialize access for this transaction。
l ORACLE在数据块中记录最近对数据行执行修改操作的N个事务的信息,目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文:Oracle permits a serializable transaction to modify a data row only if it can determine that prior changes to the row were made by transactions that had committed when the serializable transaction began. To make this determination efficiently, Oracle uses control information stored in the data block that indicates which rows in the block contain committed and uncommitted changes. In a sense, the block contains a recent history of transactions that affected each row in the block. The amount of history that is retained is controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE. Under some circumstances, Oracle may have insufficient history information to determine whether a row has been updated by a "too recent" transaction. This can occur when many transactions concurrently modify the same data block, or do so in a very short period. You can avoid this situation by setting higher values of INITRANS for tables that will experience many transactions updating the same blocks. Doing so will enable Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block.
l The INITRANS Parameter:Oracle stores control information in each data block to manage access by concurrent transactions. Therefore, if you set the transaction isolation level to serializable, you must use the ALTER TABLE command to set INITRANS to at least 3. This parameter will cause Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block. Higher values should be used for tables that will undergo many transactions updating the same blocks.
l read-only:
l 遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。
l 不允许在本事务中进行DML操作。
l read only是serializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操作。
l Export with CONSISTENT = Y sets the transaction to read-only.
l read committed和serializable的区别和联系:
l 事务1先于事务2开始,并保持未提交状态。事务2想要修改正被事务1修改的行。事务2等待。如果事务1回滚,则事务2(不论是read committed还是serializable方式)进行它想要做的修改。如果事务1提交,则当事务2是read committed方式时,进行它想要做的修改;当事务2是serializable方式时,失败并报错“Cannot serialize access”,因为事务2看不见事务1提交的修改,且事务2想在事务一修改的基础上再做修改。具体见英文:Both read committed and serializable transactions use row-level locking, and both will wait if they try to change a row updated by an uncommitted concurrent transaction. The second transaction that tries to update a given row waits for the other transaction to commit or roll back and release its lock. If that other transaction rolls back, the waiting transaction (regardless of its isolation mode) can proceed to change the previously locked row, as if the other transaction had not existed. However, if the other (blocking) transaction commits and releases its locks, a read committed transaction proceeds with its intended update. A serializable transaction, however, fails with the error "Cannot serialize access", because the other transaction has committed a change that was made since the serializable transaction began.
l read committed和serializable可以在ORACLE并行服务器中使用。
l 关于SET TRANSACTION READ WRITE:read write和read committed 应该是一样的。在读方面,它们都避免了脏读,但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致,但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中,如果遇到待锁定资源无法锁定,应该是等待而不是放弃。这与read committed一致。
l 语句级的读一致性
l ORACLE保证语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间。
l 一个语句看不见在它开始执行后提交的修改。
l 对于DML语句,它看不见由自己所做的修改,即DML语句看见的是它本身开始执行以前存在的数据。
l 事务级的读一致性
l 事务级的读一致性保证了可重复读,并保证不会出现幻像。
l 设置隔离级别
l 设置一个事务的隔离级别
l SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
l SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
l SET TRANSACTION READ ONLY;
l 设置增个会话的隔离级别
l ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
l ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
分享到:
相关推荐
其中,OCM(Oracle Certified Master)认证被视为最高级别的专家认证,代表着持有者具备了深厚的理论基础与实践经验。本课程主要针对希望获得OCM认证的专业人士,通过系统的学习,不仅能够了解考试的形式、时间安排...
例如,使用HTTPS协议确保通信安全,对敏感信息如密码进行加密存储,以及设置合适的事务隔离级别以防止数据不一致。 总的来说,"旅行社管理系统 java"是一个采用Java和JSP技术开发,支持Oracle数据库的管理软件,...
- 通过代理服务器机制实现校区间的通信,代理服务器仅处理查询请求并转发数据,定期与各校区服务器交换数据。 3. **系统设计原则** - 系统设计遵循安全、可靠、高效和易于扩展的原则,以满足大学或高级中学的需求...
- **隔离性**:采用MVCC(Multi-Version Concurrency Control)进行并发控制,实现Read-Committed隔离级别。 - **持久性**:事务日志使用Paxos协议做多副本同步,确保数据的持久性。 综上所述,OceanBase以其独特的...
Promiscuous vPorts允许虚拟机接收所有通过其vPort的数据包,而VEPA则负责在物理交换机级别进行过滤和转发决策,确保了网络安全性和隔离性。 除了上述应用,EVB还可以用于其他“案例研究”,比如在数据中心、云计算...
- **事务支持**:提供了ACID(原子性、一致性、隔离性和持久性)级别的事务管理。 - **并发性**:支持多线程和并发连接,适用于高并发的应用场景。 - **诊断和监控**:提供详细的日志和性能统计,便于故障排查和系统...
4. 事务的隔离性分为四种级别:读未提交、读已提交、可重复读和串行化,每种级别有不同的并发控制效果。传播特性包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED,根据事务边界来...
9. **代理服务器配置**:WebLogic可以作为代理服务器转发对其他HTTP服务器或WebLogic集群的请求,实现负载均衡和安全隔离。 10. **Web应用安全性配置**:包括SSL/TLS加密、用户认证、授权和审计,以及基于角色的...
18. **Spring事务管理**: Spring的事务管理包括事务的传播行为、回滚规则、隔离级别等多个方面,提供了全面的事务控制能力。 19. **MyBatis SQL语句位置**: MyBatis中的SQL语句通常写在XML配置文件中,与Mapper接口...
6. RAID代表独立冗余磁盘阵列,常见级别包括RAID 0、RAID 1、RAID 0+1、RAID 10和RAID 5。 7. 一个磁盘最多可以创建4个主分区。 8. Windows平台的主流数据库包括SQL Server、MySQL和Oracle。 9. Linux的主要发行版有...
- 事务管理和并发控制是持久层框架的关键特性之一,Hibernate支持多种事务隔离级别和锁机制。 **6. 高级映射概念(映射关系)** - 包括延迟加载、级联操作等高级映射技术。 #### Java Servlets **1. Tomcat和...
6. **RAID**:RAID(Redundant Array of Independent Disks)是磁盘冗余阵列,常见级别包括RAID 0(带区集)、RAID 1(镜像)、RAID 0+1(带区集镜像)、RAID 10(镜像带区集)、RAID 5(分布式奇偶校验)。...
- RAID是独立冗余磁盘阵列,常见级别有RAID 0、RAID 1、RAID 0+1、RAID 10和RAID 5,不同级别提供不同的数据冗余和性能策略。 7. **磁盘分区**: - 通常,一个磁盘最多创建4个主分区。 8. **数据库系统**: - ...
- **序列化读** (`SERIALIZABLE`):最严格的隔离级别,完全避免并发问题,但可能降低性能。 #### 九、PreparedStatement 接口的使用 - `PreparedStatement` 是 `Statement` 的子接口,支持预编译 SQL 语句。 - 提高...
6. **RAID**:RAID代表独立冗余磁盘阵列,常见级别包括RAID 0、RAID 1、RAID 0+1、RAID 10和RAID 5,它们提供了不同的数据冗余和性能策略。 7. **磁盘分区**:在Windows上,一个硬盘最多可以有4个主分区。 8. **...
- **Serializable**:最高隔离级别,完全避免脏读、不可重复读、幻读等问题。 #### 第四层:LINUX 招式辨析 **1. awk 和 sed** - **awk**:强大的文本处理工具,可以进行模式匹配、替换等。 - **sed**:流编辑器...
- **请求转发**:服务器内部进行转发,客户端地址栏不变。 - **重定向**:服务器告诉客户端去另一个地址获取资源,客户端地址栏会改变。 ##### XML和Json的特点 - **XML**:格式较为复杂,适用于需要元数据的情况。...
- **事务,并发**:Hibernate支持多种事务隔离级别和锁机制。 - **高级映射概念**:如懒加载、级联保存等高级特性。 - **高级查询**:除了HQL之外,还可以使用Criteria API和Native SQL查询。 #### Java Servlets -...
- **隔离级别**:READ_UNCOMMITTED、READ_COMMITTED等。 ##### 权限概述 - **RBAC (Role-Based Access Control)**:基于角色的访问控制。 - **细粒度权限**:对特定资源的访问控制。 ##### OSCache业务场景 - **...