jdbc 隔离级别

news/2024/5/18 21:43:04 标签: JDBC, DB2, Oracle, 工作, Bean
在通过JDBC对数据库进行并发访问时,为了解决并发之间的锁的控制,JDBC提供了一个隔离级别(Isolation)的方式解决并发访问的问题。
    因为最近时间在解决公司工作流在客户现场的高并发情况下经常出现死锁(dead lock)或者事务超时情况,而工作流的应用大多数主要这几种业务:查询工作项、领取工作、完成(或者提交)工作。根据以前公司在其他应用中并没有出现这 些故障,对所上线的环境进行的分析,主要差异是出问题的系统是DB2(其他系统基本上是ORACLE)。针对上面的问题进行了下面分析。
 
数据库的差异性:
  • ORACLE数据库比较强调能够支持高并发情况下的访问,保证能够“读”到数据
  • DB2数据库比较强调高并发情况下的数据完整性,保证能够“读一致”的数据
数据库的隔离级别分析:
  • ORACLE缺省使用的是CS级别的数据库访问
  • DB2缺省使用的是RS级别的数据库访问
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 bean,jdbc connection方式获得的数据库连接缺省都是TRANSACTION_REPEATABLE_READ
  • 在通过数据源获得DB2的数据库连接时候,DB2JDBC driver会缺省修改当前连接的隔离级别到TRANSACTION_REPEATABLE_READ
工作流应用分析:
 
    在工作流应用中,主要是这些操作:查询工作项、领取工作、完成(或者提交)工作
  • 查询工作项,数据库操作是select,在工作流应用中的操作频率最高
  • 领取工作,数据库操作是update,在工作流应用中的操作频率较低
  • 完成(或者提交)工作,数据库操作主要是update、insert,在工作流应用中的操作频率较低
    根据上面的应用分析,工作流应用中大量的select,少量对数据进行update,而发生死锁(dead lock)的现象是在DB2,在ORACLE上基本没有发生的主要原因是:
 
    DB2中数据库的隔离级别是rs,如果系统中有大量的select,特别是如果查询的工作项特别多,查询慢的情况下,造成其他的update操作等待select请求结束,如果又有大量的select请求过来时会出现死锁(dead lock)
 
解决方案:
 
    首先考虑参照ORACLE的模式,将DB2JDBC连接的隔离级别改为TRANSACTION_READ_COMMITTED,来提高并发能力,通常情况下获取数据库连接都是通过一个方法获得,因此可以直接改这个方法获得连接后直接将JDBC的Connection的隔离级别调整为TRANSACTION_READ_COMMITTED。但是在验证这种方案是发现了一个问题:
    如果在一个JTA事务中,先获取一个JDBC的Connection,程序修改了隔离级别到TRANSACTION_READ_COMMITTED, 在这个Connection中进行了数据库操作,然后关闭连接,再从数据源中获取Connection时候,DB2的Driver会修改当前的连接的隔离 级别,造成了在一个全局事务中修改了隔离级别,系统会自动抛出异常。
 
    上面的方案中是对任何一个Connection都修改隔离级别,因为存在问题,因此只能对单个数 据库请求进行隔离级别的操作。对所有的获取工作项的select查询语句之后添加上 with cs的方式,这样这条查询请求并不会锁住表,其他update操作就能够正常工作

http://www.niftyadmin.cn/n/1552153.html

相关文章

虚拟化如何更好的服务企业私有云?

摘要:随着云的热度升高,也使得虚拟化技术更加炙手可热。而在实现云应用的过程中,特别是私有云,虚拟化是其中的关键技术。那么,到底什么算是私有云呢?私有云则是指一个企业单独使用而构建的环境,…

enqueue_task和dequeue_task源码分析

enqueue_task源码分析 本章分析enqueue_task和dequeue_task函数的源码。enqueue_task将进程添加到具体的运行队列中,dequeue_task相反,下面来看。 enqueue_task kernel/sched/core.c static void enqueue_task(struct rq *rq, struct task_struct *p…

简单的JMS实例,包括点对点和主题订阅

程序代码:JMSTest.javapackage com.lizongbo.jmsdemo;import javax.jms.MessageListener;import javax.naming.Context;import javax.jms.QueueConnectionFactory;import javax.jms.QueueConnection;import javax.jms.QueueSession;import javax.jms.QueueSender;im…

Oracle 11g 中日志的查看

Oracle11g 中对alert的告警日志的修改一.首先介绍2个新名词Automatic Diagnostic Repository (ADR)一个存放数据库诊断日志、跟踪文件的目录,称作ADR base,对应初始化参数DIAGNOSTIC_DEST,如果设置了ORACLE_BASE环境变量&#xff…

grub源码分析---1

grub源码分析—1 本章开始分析grub的源码,版本为2.02。 系统开机启动后,BIOS会将硬盘(假设从硬盘启动)的第一个扇区装载到内存0x7c00位置开始执行,该地址对应grub(假设使用grub引导)中的start…

Java 6 RowSet 使用完全剖析

RowSet 简介 javax.sql.rowset 自 JDK 1.4 引入,从 JDK 5.0 开始提供了参考实现。它主要包括 CachedRowSet,WebRowSet,FilteredRowSet,JoinRowSet 和 JdbcRowSet。 除了 JdbcRowSet 依然保持着与数据源的连接之外,其余…

Oracle 10g Scheduler 特性

10g 环境中,ORACLE 建议使用Scheduler 替换普通的job,来管理任务的执行。其实,将Scheduler 描述成管理job 的工具已经太过片面了,10G版本中新增的Scheduler 绝不仅仅是创建任务这么简单. 一. 使用Jobs 所谓JOBS&#…

grub源码分析---2

grub源码分析—2 继续上一章的分析,0x8200地址处的代码定义在startup_raw.S文件中。 _start grub-core/boot/i386/pc/startup_raw.S _start: LOCAL (base):ljmp $0, $ABS(LOCAL (codestart))...LOCAL (codestart):clixorw %ax, %axmovw %ax, %dsmovw %…