ORACLE的隔离级别-实用经典版-(isolation level)

本文详细介绍了Oracle数据库中的隔离级别概念,包括未提交读、提交读、重复读和序列化等不同级别及其对并发性和数据一致性的权衡。此外,还探讨了Oracle特有的只读隔离级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE的隔离级别

 

 全球第一款网络点验钞机诞生在浙江温州 ,点钞机/网络点钞机,通过客户端维融金网卫士连接网络,云存储数据和网络验钞

隔离级别(isolation level

SQL92标准定义:

 

u  隔离级别定义了事务与事务之间的隔离程度。

u  隔离级别与并发性是互为矛盾的.隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

u  ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:

n  未提交读(read uncommitted

n  提交读(read committed

n  重复读(repeatable read

n  序列化(serializable

u  通过一些现象,可以反映出隔离级别的效果。这些现象有:

n  更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。

n  脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

n  非重复读(non-repeatable read):同一查询语句在同一事务中多次进行,如果这个过程中其他事务提交了所做的修改或删除,会发生每次返回不同的结果集,此时发生非重复读。

u  幻象(phantom read):同一查询语句(查询条件都一样)在同一事务中多次进行,由于其他事务提交了所做的插入操作,有可能这些插入的的数据符合该查询语句的查询条件,那么每次返回不同的结果集,此时发生幻象读。

下面是隔离级别及其对应的可能出现或不可能出现的现

ISOLATION LEVEL

Dirty Read

Non-repeatable 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支持三种隔离界别。 ORACLE提供了SQL92标准中的read committedserializable,同时提供了非SQL92标准的read-onlyOracle默认的隔离级别是read committed

read committed (DEFAULT):读提交

l         这是ORACLE缺省的事务隔离级别。

l         事务中的每一条语句都遵从语句级的读一致性。

l         保证不会脏读;但可能出现非重复读和幻像。

 

ORACLE 隔离级别(Isolation level-serializable:序列化

u  serializable,顾名思义,序列化的,就是使事务看起来像是一个接着一个地顺序地执行。

u  仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。

u  保证不会出现非重复读和幻象

u  Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作。

u  如果一个serializable事务包含有对数据的DML操作,尝试去修改别的事务在它开始之前已经修改还没有提交的数据,并且这个serializable的事务没有回滚,那么它会报一个错:ORA-08177: Cannot serialize access for this transaction也就是说如果有一个A事务(没有具体类型)做了些DML操作,更新了一些数据,还没提交,这是一个Bserializable)事务开始,在事务中B事务对A事务更新过的一些数据做了DML操作,那么如果提交了,Bserializable事务就会报错,如果B事务回滚了则不会报错。

u  ORACLE在数据块中记录最近对数据行执行修改操作的N个事务的信息,目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文:

[ORACLE 隔离级别(Isolation level-read-only]:只读

u   遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。

u   不允许在本事务中进行DML操作

u   read onlyserializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操作。

u   Export with CONSISTENT = Y sets the transaction to read-only.

 

ORACLE  read committedserializable的区别和关系

【同点】read committed(A) and serializable(B)事务都是用row-level锁,如果他们想要修改一行数据,而这行数据已经被另外事务(C,D…)修改但还没提交,他们都会等待另外事务提交或者回滚以释放资源。如果另外的事务回滚释放了资源,他们都可以停止等待继续进行下去修改这行数据。【不同点】如果另外的事务提交了这行的修改并释放了资源,read committed(A) 事务将会停止等待继续这行数据修改,但是serializable(B)事务将会失败并抛出错误"Cannot serialize access"。因为另外的事务提交 在 serializable(B)之前做的修改。

 

【例子】事务1先于事务2开始,并保持未提交状态。事务2想要修改被事务1修改的行。事务2等待。如果事务1回滚,则事务2(不论是read committed还是serializable方式)停止等待继续进行它想要做的修改。如果事务1提交,则当事务2read committed方式时,进行它想要做的修改;当事务2serializable方式时,失败并报错“Cannot serialize access”,因为事务2看不见事务1提交的修改,且事务2想在事务一修改的基础上再做修改。

read committedserializable可以在ORACLE并行服务器中使用。

 

关于SET TRANSACTION READ WRITE

read writeread committed 应该是一样的。在读方面,它们都避免了脏读,但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致,但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中,如果遇到待锁定资源无法锁定,应该是等待而不是放弃。这与read committed一致。

ORACLE语句级的读一致性】

u  ORACLE保证语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间

u  一个语句看不见在它开始执行后提交的修改。

u  对于DML语句,它看不见由自己所做的修改,即DML语句看见的是它本身开始执行以前存在的数据。

 

【事务级的读一致性】

u  事务级的读一致性保证了可重复读,并保证不会出现幻象。

 

【设置隔离级别】

设置一个事务的隔离级别

u  SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

u  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

u  SET TRANSACTION READ ONLY;

u   

设置一个会话的隔离级别

u  ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;

u  ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;

 

### 解决 `pip install flash-attn` 使用 `--no-build-isolation` 参数时报错 当遇到 `pip install flash-attn --no-build-isolation --use-pep517` 命令失败的情况时,可以考虑以下几个方面来解决问题。 #### 1. 环境一致性验证 确保当前使用的 Python 环境与构建工具链的一致性非常重要。有时即使指定了 `--no-build-isolation` 参数,仍然可能出现依赖项缺失其他环境配置问题[^2]。 #### 2. 更新 pip 和 setuptools 为了防止因版本过低而导致的兼容性问题,建议先更新 `pip` 和 `setuptools` 到最新版本: ```bash pip install --upgrade pip setuptools wheel ``` 这一步骤有助于消除由于旧版包管理器带来的潜在冲突[^1]。 #### 3. 安装必要的开发库 某些情况下,安装过程中可能缺少必要的 C/C++ 编译器及相关头文件。对于 Linux 用户来说,可以通过以下命令安装这些必需品: ```bash sudo apt-get update && sudo apt-get install build-essential cmake libomp-dev python3-dev ``` Windows 用户则需确认已正确安装 Visual Studio Build Tools MinGW-w64 工具集[^3]。 #### 4. 尝试指定平台特定轮子(Wheel) 如果上述方法仍无法解决问题,则可尝试下载预编译好的 `.whl` 文件并直接通过 `pip` 安装。前往 [PyPI](https://pypi.org/project/flash-attn/#files),找到适合自己系统的二进制分发包后执行如下指令: ```bash pip install 路径_to_下载的_wheel_file.whl ``` 这种方法能有效规避源码编译过程中的诸多不确定性因素。 #### 5. 检查 CUDA 版本匹配度 考虑到 Flash Attention 主要用于加速 GPU 上的操作,在安装前还需核实所用 PyTorch 的 CUDA 版本是否与目标硬件相匹配。不一致可能导致驱动程序运行时错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值