`
zhhxxx
  • 浏览: 30360 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JDBC事务隔离级别 几种?(5种)

阅读更多
JDBC事务隔离级别

  如果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.setTransactionLeve (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专题(六)-JDBC专题-事务的隔离级别.docx

    如果不设置合适的隔离级别,可能会出现以下几种常见的并发问题: **2.1.1 脏读 (Dirty Read)** - 发生脏读的情况是,当一个事务正在修改某条数据但还未提交时,另一个事务却读取到了这部分未提交的数据。 - 示例:...

    JDBC事务操作例子所需jar包

    在Java中,JDBC事务处理主要涉及以下几个关键概念: 1. **Connection对象**:它是与数据库的会话,通过该对象可以开启、提交和回滚事务。在连接池中获取到的Connection通常已经自动开启了事务,但如果没有,可以...

    JDBC事务处理机制探秘

    总结起来,JDBC事务适用于简单的单库操作,而JTA事务则适合处理跨多个数据源的复杂事务场景。在J2EE环境中,容器管理的事务(如SessionBean中的JTA事务)能够提供更高的可伸缩性和可靠性。在实际应用中,根据需求...

    Oracle JDBC事务的优化.pdf

    4. **事务隔离级别选择**:Oracle数据库支持四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。根据并发需求选择合适的隔离级别...

    JDBC和hibernate事务的详解

    Hibernate支持的事务隔离级别与JDBC相同,可以通过配置`hibernate.connection.isolation`属性进行设置。 ### 3. 事务的并发处理 在多用户环境中,事务的并发处理至关重要。常见的并发问题包括: - **脏读(Dirty ...

    Spring事务管理Demo

    Spring事务管理的隔离级别包括: - `DEFAULT`:使用数据库的默认隔离级别。 - `READ_UNCOMMITTED`:最低隔离级别,允许读取未提交的数据。 - `READ_COMMITTED`:只允许读取已提交的数据,防止脏读。 - `REPEATABLE_...

    jdbc jdbc jdbc

    5. **事务(Transaction)管理**:JDBC支持ACID(原子性、一致性、隔离性和持久性)事务属性,确保数据的完整性和一致性。`Connection`对象提供了开始、提交和回滚事务的方法。 6. **批处理(Batch Processing)**...

    spring事务操作试验

    在Spring事务中,有几种常见的隔离级别可供选择,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。每种隔离级别都有其特定的并发控制策略,...

    常用jdbc包和面试题

    6. **如何设置和获取JDBC事务的隔离级别?** Connection对象的setTransactionIsolation()方法用于设置隔离级别,如Connection.TRANSACTION_READ_COMMITTED等;默认隔离级别取决于数据库。 7. **JDBC中的...

    Java与Oracle实现事务(JDBC事务)实例详解

    使用JDBC事务可以带来以下几个优点: * 保证数据的一致性和可靠性 * 提高数据的安全性 * 提高数据库的性能 六、结论 在本文中,我们探讨了Java与Oracle实现事务(JDBC事务)的实例详解,并剖析了JDBC事务的实现...

    java事务管理和事务分类

    在Java中,事务处理有以下几种类型: **JDBC事务**:这是最基本的事务管理方式,通过`Connection`对象的`setAutoCommit()`来开启或关闭自动提交,`commit()`和`rollback()`用于提交或回滚事务。JDBC事务局限于单个...

    spring-jdbc源码

    5. TransactionDefinition和PlatformTransactionManager:定义了事务的属性,如隔离级别、超时时间等,而PlatformTransactionManager则是事务管理的接口,DataSourceTransactionManager实现了这个接口。 6. ...

    JDBC SP3

    4. **事务管理**:根据业务需求正确设置事务隔离级别,确保数据一致性。 总结来说,JDBC SP3是针对SQL Server的一种优化的JDBC驱动,它为Java开发者提供了高效、安全和稳定的数据库访问手段。了解并熟练运用JDBC的...

    jdbc sqlserver2014

    5. **事务管理**:JDBC支持事务控制,包括提交(`Connection.commit()`)、回滚(`Connection.rollback()`)和设置隔离级别。 6. **批处理**:通过`Statement`的`addBatch()`和`executeBatch()`方法,可以批量执行多条...

    JDBC 驱动加载过程分析

    - **事务管理**:JDBC提供了事务控制API,允许开发者管理数据库事务的提交、回滚和隔离级别。 - **异常处理**:在处理数据库操作时,必须正确处理`SQLException`及其子类,确保程序的健壮性。 - **性能优化**:...

    JDBC资料文档第一部分

    此外,还有一些高级处理,如批处理更新、事务隔离和可滚动结果集等。 2. **javax.sql**:提供了一些高级接口和类,用于更复杂的数据库操作,如连接管理、分布式事务和旧有连接的改进等。主要包含以下对象和接口: ...

    Java事务总结.docx

    为了解决上述问题,数据库提供了不同级别的事务隔离,共有五种隔离级别: 1. **串行化(Serializable)**:最高级别的隔离,保证事务的顺序执行,避免了所有并发问题。 2. **可重复读(Repeatable Read)**:允许同一...

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

    5. **事务配置**:在Spring XML配置文件中,我们需要配置事务管理器,例如DataSourceTransactionManager用于JDBC事务,HibernateTransactionManager用于Hibernate事务。同时,还需要开启事务代理,如下所示: ```...

    Oracle Database 11g 第 2 版 (11.2.0.4) JDBC 驱动程序— 包含 JDBC 示例程序。

    - 事务管理:根据业务需求设置恰当的事务隔离级别和回滚策略。 总之,Oracle Database 11g 第 2 版 (11.2.0.4) JDBC驱动程序为Java开发者提供了与Oracle数据库交互的高效工具,结合示例程序,开发者可以深入了解和...

    JDBC学习笔记.txt

    为了控制并发操作对数据的影响,可以设置不同的事务隔离级别。常见的隔离级别有: - `TRANSACTION_READ_UNCOMMITTED`:最低级别的隔离级别,可能会出现脏读、不可重复读等问题。 - `TRANSACTION_READ_COMMITTED`:...

Global site tag (gtag.js) - Google Analytics