`

JDBC的事务隔离级别

 
阅读更多

(注:本文摘自http://zhhxxx.iteye.com/blog/654021,仅用于自己学习,若转载请注明出处)

 

如果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事务 JTA事务 传播特性 隔离级别

    **JDBC事务**主要针对单个数据库连接,由数据库管理系统(DBMS)自身管理事务。JDBC提供了`Connection`对象的`commit()`和`rollback()`方法用于提交和回滚事务。这是简单的单阶段提交,适用于单一数据源的情况。 **...

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

    - 当设置事务隔离级别为 `TRANSACTION_READ_UNCOMMITTED` 时,虽然提高了并发性能,但也可能会出现脏读等问题。 - 当设置事务隔离级别为 `TRANSACTION_SERIALIZABLE` 时,虽然完全避免了并发问题,但也可能会出现...

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

    在MySQL中查询当前的事务隔离级别可以通过以下命令实现: ```sql SELECT @@tx_isolation; ``` MySQL数据库默认的事务隔离级别是 `REPEATABLE READ`。 #### 结论 综上所述,事务及其四大特性对于确保数据库操作的...

    JDBC事务管理.docx

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

    JDBC的事务初探

    2. **设置事务隔离级别**:使用Connection对象的setTransactionIsolation()方法。 3. **开始事务**:调用Connection对象的setAutoCommit(false),这会关闭自动提交模式,从而开始手动事务控制。 4. **执行SQL操作**...

    JDBC事务管理项目

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

    JDBC事务操作例子所需jar包

    3. **Transaction隔离级别**:事务有四种隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。每个级别决定了一个事务在执行时能看到...

    spring JDBC事务管理

    关键类如`TransactionDefinition`定义了事务属性,如隔离级别、超时时间等;`TransactionStatus`接口则表示当前事务的状态。在事务管理器内部,Spring会根据这些信息创建并维护事务。 **工具使用**:Spring提供了...

    实例详解Spring JDBC事务管理.doc

    事务隔离级别 事务的隔离级别是指事务在执行过程中对资源的访问权限。Spring的事务管理机制提供了多种隔离级别,包括DEFAULT、NONE、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE等。开发...

    JDBC驱动程序SQLServer2000.rar

    4. 选择合适的JDBC事务隔离级别,以平衡并发性和一致性需求。 总的来说,"JDBC驱动程序SQLServer2000.rar"提供了一个重要的工具,使Java开发者能够充分利用SQL Server 2000的功能,并通过Java应用程序进行数据操作...

    JDBC初级与高级和新特性

    3. **JDBC事务隔离级别**:了解并根据业务需求设置合适的事务隔离级别,如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。 4. **异常处理**:使用try-with-resources语法确保资源的正确关闭,...

    spring的隔离级别

    接下来,我们将深入探讨`@Transactional`注解以及Spring中的事务隔离级别。 1. **什么是事务** 事务是数据库操作的基本单元,它确保一组数据库操作要么全部成功,要么全部失败。事务的存在是为了维护数据库的一致...

    Oracle JDBC事务的优化.pdf

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

    JDBC事务管理及SavePoint示例Java开发Jav

    在Java中,JDBC提供了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。每个级别的选择都直接影响到并发控制和数据一致性。...

    spring jdbc 事务

    在描述中提到的博客链接(由于实际链接无法访问,这里无法提供具体细节),可能详细讲述了如何在Spring中配置和使用JDBC事务,包括示例代码和常见问题解决。在实际项目中,理解并正确应用这些事务管理机制对于保证...

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

    Java中,JDBC提供了四种事务隔离级别: 1. 读未提交(Read Uncommitted):允许读取尚未提交的数据,可能导致脏读。 2. 读已提交(Read Committed):每次读取的都是事务提交后的最新数据,防止了脏读,但可能有不...

    基于Spring JDBC的事务管理

    Spring JDBC提供了多种事务隔离级别,例如ISOLATION_DEFAULT、ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_REPEATABLE_READ、ISOLATION_SERIALIZABLE等。 rollbackFor 属性 rollbackFor ...

    SpringJDBC注解事务.zip

    `isolation`设置事务隔离级别;`rollbackFor`指定哪些异常应导致回滚;`noRollbackFor`指明哪些异常不应导致回滚。 - **使用示例**:在Service层的方法上添加`@Transactional`,表示该方法内部的操作需在一个事务中...

    JDBC事务的保存点处理

    JDBC支持四种事务隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。每种级别都有不同的并发控制策略,以防止脏读、不可重复读和幻...

Global site tag (gtag.js) - Google Analytics