`

JDBC事务隔离级别

 
阅读更多
原文地址:http://blog.csdn.net/applehoney/article/details/2270732



如果DBMS支持事务处理,它必须有某种途径来管理两个事务同时对一个数据库进行操作时可能发生的冲突。用户可指定事务隔离级别,以指明DBMS应该花多大精力来解决潜在冲突。例如,当事务更改了某个值而第二个事务却在该更改被提交或还原前读取该值时该怎么办。

  假设第一个事务被还原后,第二个事务所读取的更改值将是无效的,那么是否可允许这种冲突?JDBC用户可用以下代码来指示DBMS允许在值被提交前读取该值("dirty读取"),其中con是当前连接:
con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);

  事务隔离级别越高,为避免冲突所花的精力也就越多。Connection接口定义了五级,其中最低级别指定了根本就不支持事务,而最高级别则指定当事务在对某个数据库进行操作时,任何其它事务不得对那个事务正在读取的数据进行任何更改。通常,隔离级别越高,应用程序执行的速度也就越慢(由于用于锁定的资源耗费增加了,而用户间的并发操作减少了)。在决定采用什么隔离级别时,开发人员必须在性能需求和数据一致性需求之间进行权衡。当然,实际所能支持的级别取决于所涉及的DBMS的功能。

  当创建Connection对象时,其事务隔离级别取决于驱动程序,但通常是所涉及的数据库的缺省值。用户可通过调用setIsolationLevel方法来更改事务隔离级别。新的级别将在该连接过程的剩余时间内生效。要想只改变一个事务的事务隔离级别,必须在该事务开始前进行设置,并在该事务结束后进行复位。我们不提倡在事务的中途对事务隔离级别进行更改,因为这将立即触发commit方法的调用,使在此之前所作的任何更改变成永久性的。


JDBC的数据隔离级别设置:

JDBC
数据库隔离级别
数据访问情况
TRANSACTION_READ_UNCOMMITTED
ur
就是俗称“脏读”(dirty read),在没有提交数据时能够读到已经更新的数据
TRANSACTION_READ_COMMITTED
cs
在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据。update数据时候并不锁住表
TRANSACTION_REPEATABLE_READ
rs
在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据
TRANSACTION_SERIALIZABLE
rr
在一个事务中进行查询时,不允许任何对这个查询表的数据修改。

JDBC事务隔离级别
        为了解决与“多个线程请求相同数据”相关的问题,事务之间用锁相互隔开。多数主流的数据库支持不同类型的锁;因此,JDBC API 支持不同类型的事务,它们由 Connection 对象指派或确定。在 JDBC API 中可以获得下列事务级别:

TRANSACTION_NONE 说明不支持事务。

TRANSACTION_READ_UNCOMMITTED 说明在提交前一个事务可以看到另一个事务的变化。这样脏读、不可重复的读和虚读都是允许的。

TRANSACTION_READ_COMMITTED 说明读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。

TRANSACTION_REPEATABLE_READ 说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。

TRANSACTION_SERIALIZABLE 是最高的事务级别,它防止脏读、不可重复的读和虚读。

        为了在性能与一致性之间寻求平衡才出现了上面的几种级别。事务保护的级别越高,性能损失就越大。
        假定您的数据库和 JDBC 驱动程序支持这个特性,则给定一个 Connection 对象,您可以明确地设置想要的事务级别:
        conn.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;
        可以通过下面的方法确定当前事务的级别:
            int level = conn.getTransactionIsolation();
            if(level == Connection.TRANSACTION_NONE)
             System.out.println("TRANSACTION_NONE");
            else if(level == Connection.TRANSACTION_READ_UNCOMMITTED)
             System.out.println("TRANSACTION_READ_UNCOMMITTED");
            else if(level == Connection.TRANSACTION_READ_COMMITTED)
             System.out.println("TRANSACTION_READ_COMMITTED");
            else if(level == Connection.TRANSACTION_REPEATABLE_READ)
             System.out.println("TRANSACTION_REPEATABLE_READ");
            else if(level == Connection.TRANSACTION_SERIALIZABLE)
             System.out.println("TRANSACTION_SERIALIZABLE");
分享到:
评论

相关推荐

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

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

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

    •隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 A ------> B B ------> C •持久性(Durability...

    Java数据编程指南

    Java数据库连接(JDBC) 什么是JDBC JDBC结构 开始起步 使用...JDBC事务隔离级别 保存点 使用光标 PreparedStatement接口 批更新 CallableStatement JDBC Escape语法 JDBC支持类 ...

    JDBC总结——事务

    文章目录事务一、事务的基本介绍1、概念2、操作3、操作实例4、MySQL数据库中默认自动提交二、事务的四大特征三、事务的隔离级别1、概念2、存在的问题3、隔离级别四、Jdbc事务控制1、概述2、控制事务的API:3、核心...

    Spring声明式事务配置管理方法

    可以在spring中对整个项目的事务进行控制

    jdbc的详细介绍

    6. 事务的隔离级别 第五章 JDBC2.0 1. ResultSet的可滚动性(默认只能向下(向前)移动) 2. ResultSet的可更新性(默认是不可以更新) 3. 批处理 4. 高级数据类型 第六章 2.0扩展内容 1. 连接池 2. 数据源(工厂模式...

    19-事务-源代码.rar

    二、JDBC事务操作 三、DBUtils事务操作 四、使用ThreadLocal绑定连接资源 五、事务的特性和隔离级别(概念性问题---面试)。 1.什么是事务 2.mysql的事务 1.QueryRunner 1.事务的特性ACID 2.并发访问问题----由...

    Java数据库接口JDBC介绍

    2.1.6 事务隔离级别 5 2.2 DriverManager类 6 2.2.1 跟踪可用驱动程序 6 2.2.2 建立连接 7 2.3 Statement对象 7 2.3.1 创建Statement对象 8 2.3.2 使用Statement对象执行语句 8 2.3.3 语句完成 8 2.3.4 语句完成...

    JDBC Java Database Connectivity

    基本目标:  了解JDBC (Java Database Connectivity)相关概念  JDBC的四种类型的驱动  JDBC核心接口与类  JDBC体系结构图和开发步骤 JDBC 事务 进阶目标: ... 事务的隔离级别 批处理(Batch)

    MyBatis 事务管理解析:颠覆你⼼中对事务的理解.pdf

    1.说到数据库事务,⼈们脑海⾥⾃然不⾃然的就会浮现出事务的四⼤特性、四⼤隔离级别、七⼤传播特性。 四⼤还好说,问题是七⼤传播特性是哪⼉来的?是Spring在当前线程内,处理多个数据库操作⽅法事务时所做的⼀种...

    Java_JDBC由浅入深

    8.6 数据库的隔离级别介绍 56 8.6.1 未提交读 57 8.6.2 提交读 58 8.6.3 重复读 59 8.6.4 序列化读 60 8.7 小结 62 第九节 PreparedStatement接口的使用 62 第十节 CallableStatement接口的使用 62 9.1 无参无返回值...

    尚硅谷_佟刚_JDBC.pptx

    11. 处理事务 & 事务的隔离级别(视频16-17) 12. 批量处理(视频18) 13. 数据库连接池 & C3P0 & DBCP(视频19-20) 14. 使用 DBUtils(视频21-23) 15. 使用 JDBC 调用函数 & 存储过程(视频24) 16. 课件及源码 ----------...

    JDBC核心技术精讲

    本课程《JDBC核心技术精讲》为...13、事务概述及事务的四大特性 14、mysql中使用事务 15、jdbc中使用事务 16、数据库连接池的介绍和使用(DBCP/C3P0/Druid)17、DBUtils工具的使用18、详细讲述结果集处理器的使用

    事务讲解-LingRan.pptx

    主要内容涉及java事务的基础,事务的四大特性,数据库中的事务,并发访问出现的问题和隔离级别设置,JDBC中的实现以及事务相关面试问题的整理汇总。

    weblogic平台J2EE调优策略

    2.6.2 优化事务隔离级别和事务属性 2.6.3 其他一些小技巧 第三章 数据库调优 3.1.1 Oracle性能优化 3.1.2 Oracle的其他调整 第四章 操作系统调优 4.1 操作系统调整 4.1.1 HP-UX 4.1.2 Solaris 4.1.3 AIX 4.1.4 Linux...

    Hasor开发框架 v3.2.2

    程序打包之后一套配置通吃(日常、预发、线上)以及其它各种环境6、完备的JDBC操作接口,支持Result -> Object映射7、提供三种途径控制事务,支持七种事务传播属性,标准的事务隔离级别8、支持多数据源、及多数据源下...

    Java开发工程师面试题资料

    有哪些隔离级别? 4. 数据类型 char 与 varchar2 有什么区别?性能方面各有什么优势? 5. 你怎么知道查询 SQL 的性能高还是低? 6. 在开发过程中遇到过数据库锁吗?怎样解锁? 7. 怎样处理并发数据? (重点) 8. ...

    spring考试通过必备材料.docx

    事务的隔离级别设置为DEFALIT 26 在applicationContext.xml中配置文件通知 27 JDBC 28 Text测试类 29 Hibernate.cfg.xml 31 AOP方法的通知 31 单独前置通知 31 单独后置通知 32 单独环绕通知 32

    Spring.html

    default:使用数据库默认的隔离级别(mysql:可重复读,oracle:读已提交) readuncommited:读未提交,不可以解决任何问题 readcommited:读已提交,可以解决脏读问题 repeatableRead:可重复读,可以解决脏读,不可重复...

    spring.doc

    5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+Hibernate 131 5.2.1 ...

Global site tag (gtag.js) - Google Analytics