`
csbison
  • 浏览: 154946 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jdbc 隔离级别

阅读更多

jdbc 隔离级别

在通过JDBC对数据库进行并发访问时,为了解决并发之间的锁的控制,JDBC提供了一个隔离级别(Isolation)的方式解决并发访问的问题。

    因为最近时间在解决公司工作流在客户现场的高并发情况下经常出现死锁(dead lock)或者事务超时情况,而工作流的应用大多数主要这几种业务:查询工作项、领取工作、完成(或者提交)工作。根据以前公司在其他应用中并没有出现这 些故障,对所上线的环境进行的分析,主要差异是出问题的系统是DB2(其他系统基本上是ORACLE)。针对上面的问题进行了下面分析。

 

数据库的差异性:

ORACLE数据库比较强调能够支持高并发情况下的访问,保证能够到数据

DB2数据库比较强调高并发情况下的数据完整性,保证能够读一致的数据

数据库的隔离级别分析:

ORACLE缺省使用的是CS级别的数据库访问

DB2缺省使用的是RS级别的数据库访问

JDBC的数据隔离级别设置:

 

JDBC

数据库隔离级别

数据访问情况

TRANSACTION_READ_UNCOMMITTED

ur

就是俗称脏读dirty read),在没有提交数据时能够读到已经更新的数据

TRANSACTION_READ_COMMITTED

cs

在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据。update数据时候并不锁住表

TRANSACTION_REPEATABLE_READ

rs

在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据

TRANSACTION_SERIALIZABLE

rr

在一个事务中进行查询时,不允许任何对这个查询表的数据修改。

 

websphere环境中通过JDBC连接DB2数据库的隔离级别的情况:

只有使用实体(Entity Bean)的情况下可以通过修改ibm的部署文件修改当前数据操作的隔离级别

如果通过session beanjdbc connection方式获得的数据库连接缺省都是TRANSACTION_REPEATABLE_READ

在通过数据源获得DB2的数据库连接时候,DB2JDBC driver会缺省修改当前连接的隔离级别到TRANSACTION_REPEATABLE_READ

工作流应用分析:

 

    在工作流应用中,主要是这些操作:查询工作项、领取工作、完成(或者提交)工作。

查询工作项,数据库操作是select,在工作流应用中的操作频率最高

领取工作,数据库操作是update,在工作流应用中的操作频率较低

完成(或者提交)工作,数据库操作主要是updateinsert,在工作流应用中的操作频率较低

    根据上面的应用分析,工作流应用中大量的select,少量对数据进行update,而发生死锁(dead lock)的现象是在DB2,在ORACLE上基本没有发生的主要原因是:

 

    DB2中数据库的隔离级别是rs,如果系统中有大量的select,特别是如果查询的工作项特别多,查询慢的情况下,造成其他的update操作等待select请求结束,如果又有大量的select请求过来时会出现死锁(dead lock

 

解决方案:

 

    首先考虑参照ORACLE的模式,将DB2JDBC连接的隔离级别改为TRANSACTION_READ_COMMITTED,来提高并发能力,通常情况下获取数据库连接都是通过一个方法获得,因此可以直接改这个方法获得连接后直接将JDBCConnection的隔离级别调整为TRANSACTION_READ_COMMITTED。但是在验证这种方案是发现了一个问题:

    如果在一个JTA事务中,先获取一个JDBCConnection,程序修改了隔离级别到TRANSACTION_READ_COMMITTED 在这个Connection中进行了数据库操作,然后关闭连接,再从数据源中获取Connection时候,DB2Driver会修改当前的连接的隔离 级别,造成了在一个全局事务中修改了隔离级别,系统会自动抛出异常。

 

    上面的方案中是对任何一个Connection都修改隔离级别,因为存在问题,因此只能对单个数 据库请求进行隔离级别的操作。对所有的获取工作项的select查询语句之后添加上 with cs的方式,这样这条查询请求并不会锁住表,其他update操作就能够正常工作。

 

分享到:
评论

相关推荐

    JDBC事务 JTA事务 传播特性 隔离级别

    - **未提交读(Read Uncommitted)**:最低的隔离级别,允许读取未提交的数据,可能导致脏读、不可重复读和幻读。 - **提交读(Read Committed)**:在提交后才允许读取数据,防止脏读,但可能出现不可重复读和幻...

    JDBC专题(六)-JDBC专题-事务的隔离级别.docx

    ### JDBC专题(六)-JDBC专题-事务的隔离级别 #### 一、事务的基本概念与特性 事务在数据库管理中扮演着极其重要的角色,尤其是在处理关键业务逻辑时,确保数据的一致性和完整性至关重要。根据提供的文件信息,我们...

    spring的隔离级别

    如果没有明确指定,Spring默认使用`DEFAULT`,对应JDBC的默认隔离级别,通常为`READ_COMMITTED`。 5. **事务隔离级别的选择** 隔离级别越高,防止并发问题的能力越强,但同时也可能降低了系统的并发性能。因此,...

    Spring 事务 (二) Spring 声明式事务 配置

    3. **事务隔离级别**:事务的隔离级别决定了并发操作时的数据可见性,Spring支持四种标准的JDBC隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。 4. **事务回滚规则**:默认情况下,...

    【IT十八掌徐培成】Java基础第24天-03.事务并发现象-隔离级别2-表级锁-隔离级别API.zip

    本课程将详细解释这些概念,并通过实例演示如何在Java中实现和管理事务,以及如何利用JDBC设置不同的隔离级别。通过学习这部分内容,开发者将能够更好地理解和处理数据库并发问题,提高应用程序的稳定性和可靠性。

    JDBC事务控制--讲述如何控制JDBC事务

    JDBC 支持四种不同的事务隔离级别,每种级别的隔离效果不同,可以根据具体的应用需求选择合适的级别: 1. **TRANSACTION_NONE**:不支持事务隔离。 2. **TRANSACTION_READ_UNCOMMITTED**:允许读取未提交的数据。 3...

    JBoss jBPM jPDL中文指南

    - **JDBC隔离级别**:控制了事务的一致性和隔离程度。 - **变更jBPM数据库**:如果需要更换数据库,则需要进行相应的调整。 通过以上详尽的介绍,我们可以看出jBPM jPDL是一个功能强大且灵活的工作流引擎。它不仅...

    jdbc2000,jdbc2005

    5. **并发控制(Concurrency Control)**:提供了读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)四种事务隔离级别,增强了数据一致性。...

    【IT十八掌徐培成】Java基础第24天-02.事务并发现象-隔离级别.zip

    JDBC提供了Connection对象的setAutoCommit()方法来开启或关闭自动提交,而Spring则提供了@Transactional注解进行声明式事务管理,可以在方法级别上指定事务属性,如隔离级别。 例如,在Spring中,我们可以这样设置...

    sqljdbc_6.0.zip

    - **事务支持**:支持JDBC的事务隔离级别,如READ UNCOMMITTED、READ COMMITTED等。 - **安全**:提供集成的身份验证和加密功能,确保数据传输的安全。 6. **注意事项** - 驱动版本与JRE版本的匹配至关重要,...

    JDBC事物应用源码文件

    7. **事务隔离级别**:JDBC定义了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。不同的隔离级别影响并发性能和数据一致性。...

    尚硅谷jdbc视频教程

    4. **合理设置事务隔离级别**:根据实际需求调整事务的隔离级别,既能保证数据的一致性,又能提高并发处理能力。 #### 六、常见问题及解决方案 1. **连接超时**:检查网络连接是否正常,同时调整连接超时时间。 2. ...

    JDBC的事务初探

    JDBC支持四种事务隔离级别: 1. **读未提交(READ UNCOMMITTED)**:最低级别,可能读到未提交的数据,可能出现脏读、不可重复读和幻读。 2. **读已提交(READ COMMITTED)**:防止脏读,但可能产生不可重复读。 3....

    sqljdbc41.jar

    2. 提供强大的事务管理能力,支持各种事务隔离级别。 3. 支持Unicode,可以处理多种语言的数据。 4. 支持批处理,提高批量操作的效率。 5. 内置错误处理机制,能够捕获和报告SQLServer相关的异常。 6. 支持SQLServer...

    Spring控制Hibernate中的事务传播特性与隔离级别操作.docx

    让我们深入了解一下这两个类以及它们如何处理事务传播特性和隔离级别。 首先,HibernateTemplate是Spring对Hibernate原生Session的一个包装,它提供了一种更安全、方便的方式来执行常见的Hibernate操作。与直接使用...

    JDBC事务管理.docx

    在JDBC中,可以通过设置Connection对象的事务隔离级别来控制并发行为。例如,使用`setTransactionIsolation()`方法可以设置为`Connection.TRANSACTION_READ_COMMITTED`来实现读已提交的隔离级别,从而避免脏读。同时...

    JDBC事务管理项目

    “JDBC事务管理项目”涵盖了如何在Java应用中利用JDBC进行事务控制,包括开启手动事务、提交、回滚以及设置事务隔离级别等。理解并掌握这些知识对于开发健壮的数据库应用至关重要,能够确保数据的完整性和一致性。

    驱动程序jdbc_4.2

    JDBC支持四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。开发者可以根据应用程序的需求选择合适的隔离级别。 **六、优化与...

    SQL Server JDBC Jar包

    4. **事务支持**:JDBC驱动支持多种事务隔离级别,允许开发者根据应用需求控制事务的并发性和一致性。 5. **Unicode支持**:全面支持Unicode字符集,使得跨语言和地区的数据处理成为可能。 6. **高级查询功能**:...

    sqlserver 2008 jdbc 驱动包

    同时,驱动还支持一些高级特性,如批处理、游标、存储过程调用、事务隔离级别设置等,以满足复杂的应用场景需求。因此,对于那些基于Java平台并需要与SQL Server 2008交互的项目,这个驱动包是不可或缺的工具。

Global site tag (gtag.js) - Google Analytics