JDBC事务隔离级别

原创 2012年03月30日 09:22:11
如果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 对象。
您可以明确地设置想要的事务级别:
       
Java代码 复制代码 收藏代码
  1. conn.setTransactionLeve (TRANSACTION_SERIALIZABLE);  

可以通过下面的方法确定当前事务的级别:
Java代码 复制代码 收藏代码
  1. int level = conn.getTransactionIsolation();   
  2. if(level == Connection.TRANSACTION_NONE)   
  3. System.out.println("TRANSACTION_NONE");   
  4. else if(level == Connection.TRANSACTION_READ_UNCOMMITTED)   
  5. System.out.println("TRANSACTION_READ_UNCOMMITTED");   
  6. else if(level == Connection.TRANSACTION_READ_COMMITTED)   
  7. System.out.println("TRANSACTION_READ_COMMITTED");   
  8. else if(level == Connection.TRANSACTION_REPEATABLE_READ)   
  9. System.out.println("TRANSACTION_REPEATABLE_READ");   
  10. else if(level == Connection.TRANSACTION_SERIALIZABLE)   
  11. System.out.println("TRANSACTION_SERIALIZABLE");   

JDBC事务 隔离级别 介绍 与理解

事务隔离级别 事务是用户定义的一个数据库操作系列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 定义事务的语句 Begin transaction; Commit; Roll back;事...

JDBC 大数据集分页 ,大数据读写及事务的隔离级别

一、大数据集的分页 1、内存分页:将数据全部取出来放到List中,然后再进行分页。(不可取的) 2、数据库层分页:按照页码从数据查询。  MySQL:Select * from table li...

JDBC和事务的隔离级别

事务和JDBC事务隔离级别 博客分类:  需学习 与事务相关的理论 事务(Transaction):        是并发控制的单元,是用户定义的一个...
  • dusin
  • dusin
  • 2014年02月17日 22:01
  • 403

JDBC 事务的传播特性和隔离级别

事务的传播特性: 1、required:

JDBC设置事务的隔离级别和转账案例

转帐案例    1)参见图>    2)项目中,事务可能在dao层,也可能在service层,不论在哪一层,都必须确保使用的都是同一个connection    3)为了确保在Service...
  • boxyuan
  • boxyuan
  • 2017年02月02日 11:25
  • 186

JDBC之事务隔离级别以及ACID特性

事务隔离级别:   1.更新遗失(Lost update)      两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何...

JDBC事务隔离级别

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

(转)jdbc事务隔离级别

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

事务和JDBC事务隔离级别

与事务相关的理论 事务(Transaction):        是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql serv...

Java -- JDBC 事务处理, 事务的隔离级别 脏读 不可重复读 等...

1. 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 数据库开启事务命令 •start transaction  开启事务 •Rollback  回滚事务 •Comm...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDBC事务隔离级别
举报原因:
原因补充:

(最多只允许输入30个字)