JDBC隔离级别 | 数据库隔离级别 | 数据访问情况 |
TRANSACTION_READ_UNCOMMITTED(未提交的读)Uncommitted Read | ur | 就是俗称“脏读”(dirty read),在没有提交数据时能够读到已经更新的数据 |
TRANSACTION_READ_COMMITTED (游标稳定性)Cursor Stability | cs | 在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据。update数据时候并不锁住表 |
TRANSACTION_REPEATABLE_READ (读稳定性)Read Stability | rs | 在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据 |
TRANSACTION_SERIALIZABLE (可重复的读)Repeatable Read | rr | 在一个事务中进行查询时,不允许任何对这个查询表的数据修改。 |
“可重复的读”隔离级别rr
当使用可重复的读隔离级别时,在单个事务执行期间锁定该事务引用的所有行。使用这种隔离级别时,同一事务多次发出的同一个 SELECT 语句将始终产生同一结果;丢失更新、脏读、不可重复的读、幻像都不会发生。
使用可重复的读隔离级别的事务可以多次检索同一行集,并可以对它们执行任意次操作,直到由提交或回滚操作终止事务;不允许其它事务执行插入、更新或删除操作,因为这些操作会在隔离事务存在期间影响正在被使用的行集。为了确保在“可重复的读”隔离级别下运行的事务所访问的数据不会受其它事务的负面影响,所以锁定了该隔离事务所引用的每个行 — 而不是仅锁定被实际检索和/或修改的那些行。因此,如果一个事务扫描了 1000 行但只检索 10 行,则所扫描的 1000 行(而不仅是被检索的 10 行)都会被锁定。
那么在现实环境中这个隔离级别是如何工作的呢?假定您拥有一家大型旅馆,并有一个网站,该网站按“先到先服务”的原则接受客户的房间预订。如果您的旅馆预订应用程序是在“可重复的读”隔离级别下运行的,当客户检索某个日期段内的所有可用房间列表时,您将无法更改那些房间在指定日期范围内的费用,而其他客户也将无法进行或取消将会更改该列表的预订,直到生成该列表的事务终止为止。(对于第一个客户的查询所指定范围之外的任何房间,您都可以更改房价,其他客户也都可以进行或取消房间预订。)
“读稳定性”隔离级别rs
当使用读稳定性隔离级别时,在单个事务执行期间,会锁定该事务所检索的所有行。当使用这种隔离级别时,直到隔离事务终止之前,其它事务不能更改隔离事务读取的所有行。此外,其它事务对其它行所作的更改,在提交之前对于运行在“读稳定性”隔离级别下的事务而言是不可见的。因此,当使用“读稳定性”隔离级别时,在同一事务中多次发出 SELECT 语句可能会产生不同的结果。丢失更新、脏读和不可重复的读都不会发生;但是,有可能出现幻像。
使用“可重复的读”隔离级别时,隔离事务引用的每一行都被锁定;但是,在“读稳定性”隔离级别下,只锁定隔离事务实际检索和/或修改的行。因此,如果一个事务扫描了 1000 行但只检索 10 行,则只有被检索到的 10 行(而不是所扫描的 1000 行)被锁定。
那么,这种隔离级别会如何改变旅馆预订应用程序的工作方式呢?现在,当一个客户检索某个日期段内的所有可用房间列表时,您可以更改旅馆中任何房间的房价,而其他客户也可以取消在第一个客户的查询所指定的日期段内所保留房间的预订。因此,如果在终止提交查询的事务之前再次生成列表,则产生的新列表中有可能包含新的房价或第一次产生列表时不可用的房间。
“游标稳定性”隔离级别cs
当使用游标稳定性隔离级别时,只要隔离事务所用的游标定位在某一行上,就会锁定该游标所引用的这一行。所获取的锁一直有效,直到游标重定位(通常通过调用 FETCH 语句)或隔离事务终止为止。因此,当使用这种隔离级别时,在同一事务中多次发出 SELECT 语句可能会产生不同的结果。丢失更新和脏读不会发生;但有可能出现不可重复的读和幻像。
当使用“游标稳定性”隔离级别的事务通过可更新游标从表中检索行时,在游标定位在该行上时,其它事务不能更新或删除该行。但是,如果被锁定的行本身不是用索引访问的,那么其它事务可以将新的行添加到表,并对位于被锁定行前后的行进行更新和/或删除操作。此外,如果隔离事务修改了它检索到的任何行,那么在隔离事务终止之前,即使在游标不再位于这个被修改的行,其它事务不能更新或删除该行。
其它事务在其它行上进行的更改,在提交之前对于使用“游标稳定性”隔离级别的事务是不可见的。缺省情况下,大多数事务都使用“游标稳定性”隔离级别。
这种隔离级别对旅馆预订应用程序有什么影响呢?现在,当一个客户检索某个日期段内的所有可用房间列表,然后查看关于所产生的列表上每个房间的信息时(每次查看一个房间),您可以更改旅馆中任何房间的房价,而其他客户可以对任何日期段的任何房间进行或取消预订;唯一的例外是第一个客户当前正在查看的房间。当第一个客户查看列表中另一个房间的信息时,对于这个新房间也是一样;您现在可以更改第一个客户刚才查看的房间的房价,其他客户也可以预订该房间,但不能对第一个客户当前正在查看的房间进行这些操作。
“未提交的读”隔离级别ur
在使用未提交的读隔离级别的情况中,当单个事务检索行时,仅当另一个事务试图删除或更改被检索的行所在的表时,才会在单个事务期间锁定这些行。因为在使用这种隔离级别时,行通常保持未锁定状态,所以丢失更新、脏读、不可重复的读和幻像都可能会发生。
在大多数情况下,其它事务对行所作的更改,在提交或回滚之前对于使用“未提交的读”隔离级别的事务是可见的。但是,此类事务不能看见或访问其它事务所创建的表、视图或索引,直到那些事务被提交为止。类似地,如果其它事务删除了现有的表、视图或索引,使用“未提交的读”隔离级别的事务仅当进行删除操作的事务终止时才能了解这一情况。这种行为有一个例外:当运行在“未提交的读”隔离级别下的事务使用可更新游标时,该事务的行为和在“游标稳定性”隔离级别下运行一样,并应用“游标稳定性”隔离级别的约束。
“未提交的读”隔离级别通常用于那些访问只读表的事务和/或某些执行 SELECT 语句的事务,这些语句对其它事务的未提交数据没有负面效果。
那么这种隔离级别对旅馆预订应用程序有什么影响呢?现在,当一个客户检索某个日期段内的所有可用房间列表时,您可以更改旅馆中任何房间的房价,而其它客户也可以对任何日期段内的任何房间进行或取消预订。此外,如果其它客户取消了预订,即使他们还没有终止其事务并将那些取消提交到数据库,所生成的列表就可以包含这些取消预订的房间了。
2. 数据库之间的差异: 1).Oracle通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。其DML锁(数据锁)分为两个层次(粒度):即表级和行级。通常的DML操作在表级获得的只是意向锁(RS或RX),其真正的封锁粒度还是在行级;DB2也是通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。其DML锁(数据锁)分为两个层次(粒度):即表级和行级。通常的DML操作在表级获得的只是意向锁(IS,SIX或IX),其真正的封锁粒度也是在行级;另外,在Oracle数据库中,单纯地读数据(SELECT)并不加锁,这些都提高了系统的并发程度,Oracle强调的是能够"读"到数据,并且能够快速的进行数据读取。而DB2的锁强调的是"读一致性",进行读数据(SELECT)时会根据不同的隔离级别(RR,RS,CS)而分别加 S,IS,IS锁,只有在使用UR隔离级别时才不加锁。从而保证不同应用程序和用户读取的数据是一致的。
2). 在支持高并发度的同时,DB2和Oracle对锁的操纵机制有所不同:Oracle利用意向锁及数据行上加锁标志位等设计技巧,减小了Oracle维护行级锁的开销,使其在数据库并发控制方面有着一定的优势。而DB2中对每个锁会在锁的内存(locklist)中申请分配一定字节的内存空间,具体是X锁 64字节内存,S锁32字节内存(注:DB2 V8之前是X锁72字节内存而S锁36字节内存)。
3). Oracle数据库中不存在锁升级,而DB2数据库中当数据库表中行级锁的使用超过locklist*maxlocks会发生锁升级。
4). 在Oracle中当一个session对表进行insert,update,delete时候,另外一个session仍然可以从Orace回滚段或者还原表空间中读取该表的前映象(before image); 而在DB2中当一个session对表进行insert,update,delete时候,另外一个session仍然在读取该表数据时候会处于lock wait状态,除非使用UR隔离级别可以读取第一个session的未提交的值;所以Oracle同一时刻不同的session有读不一致的现象,而 DB2在同一时刻所有的session都是"读一致"的。 5). db2缺省下是使用cs级别,oracle缺省是使用ur
分享到:
相关推荐
- **描述**: 在设置隔离级别时出现问题。 ##### 54. 超时 - **SQLCODE**: +80701 - **SQLSTATE**: 554 - **描述**: 操作超时。 ##### 55. 字符集问题 - **SQLCODE**: +86301 - **SQLSTATE**: 610 - **描述**: 在...
53. **+80601553**: 隔离级别设置问题。 54. **+80701554**: 事务处理问题。 55. **+86301539**: 字符集映射问题。 #### 负数错误码详解 负数错误码通常涉及到SQL语句的语法错误或逻辑问题,下面解释部分负数错误码...
"DB2_731 题库 模拟题 详解 考试指南"的主题聚焦于DB2 9数据库管理的731考试,这是一个针对DB2数据库管理员的专业认证考试。该题库和模拟题详解旨在帮助考生准备并熟悉考试的内容和格式。 DB2 731考试主要测试考生...
- DB2 的锁定机制与隔离级别。 - 如何优化并发环境下的数据库性能。 ##### 7. **DB2 PureXML 技术概述** - **特点**: 强调 DB2 在存储和处理 XML 数据方面的能力。 - **内容**: - PureXML 技术的工作原理。 - ...
### DB2数据库系统加固规范详解 #### 账号管理与认证授权 **1.1.1 使用加密的AUTHENTICATION模式** 编号:SHG-DB2-01-01-01 名称:使用加密的AUTHENTICATION模式 实施目的:确保数据传输的安全性,通过加密的...
#### 二、DB2隔离级别 DB2提供了四种不同的隔离级别,分别为UR(未提交读)、CS(游标稳定性)、RS(读稳定性)以及RR(可重复读)。每个级别的设置都会影响到锁的行为方式。 1. **UR(未提交读)** - 对于只读...
本文详细介绍了DB2数据库中锁等待问题的解决流程,从开启监控开关到优化SQL语句,再到调整隔离级别和提高并发能力等多个方面进行了阐述。通过遵循这些步骤,可以有效地解决DB2数据库中的锁等待问题,从而提升系统的...
通过调整DB2的隔离级别,如从串行化降低到读已提交,可以减少锁定冲突。但请注意,这可能会影响数据一致性。 4. **审查安全策略**:检查数据库的访问控制列表(ACL)和安全策略,确保它们不会不必要地限制用户操作...
- **事务隔离级别**:根据应用程序的需求调整事务的隔离级别,以平衡读取一致性与并发控制之间的矛盾。 - **锁机制调整**:合理配置锁的粒度和模式,减少锁等待时间。 - **并发工具的使用**:利用DB2提供的并发工具...
### DB2 报错集锦知识点详解 #### 标题:DB2 报错集锦 - **描述**:本文档列举了一系列 DB2 数据库在运行过程中可能遇到的错误代码及其对应的 SQL 状态码,旨在帮助数据库管理员或开发人员快速定位问题并解决问题。...
- **01526** - **隔离级别升级**:在某些情况下,DB2会自动提升隔离级别以防止数据冲突。 - **01527** - **专用寄存器不存在**:如果SET语句引用的专用寄存器在AS上不存在,则会发出此警告。需要确认是否存在相应的...
- **事务隔离级别**: 通常保持默认设置。 - **XA数据源**: 选择`是`,因为DB2支持XA事务。 - **JTA事务**: 确认启用了JTA事务支持。 3. **连接池配置**: - **初始容量**: 调整为适合应用的初始连接数量。 - **...
- 事务管理:JDBC支持自动和手动事务模式,根据应用需求选择合适的事务隔离级别。 - 错误处理:在执行SQL语句时,需要捕获并处理可能抛出的异常,如`SQLException`。 最后,安全性和性能优化也是JDBC开发中不可忽视...
- **+806 (01553)**:隔离级别为RR时,锁大小与页大小冲突。 - **+807 (01554)**:无法执行操作,因为存在并发冲突。 - **+863 (01539)**:字符集映射错误,只支持SBCS字符集。 - **+2000 (56094)**:子页面数量超过...
本文将通过表格分析法来探讨DB2中的并发机制,特别是关于事务、隔离级别、锁以及锁兼容性的内容。 #### 二、基础概念回顾 ##### 1. 事务(工作单元) - **定义**:在DB2中,事务也被称为工作单元,它是应用程序...
- 应仔细研究两者的隔离级别设置,以避免由于隔离级别的不同而导致的数据不一致问题。 2. **事务恢复:** - 恢复机制对于保证数据完整性至关重要。DB2 LUW 和 UDB400 可能采用不同的恢复策略。 - 开发人员应关注...