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");   

Spring(十三)JDBC相关概念、事务隔离级别、事务传播属性、事务管理及Spring整合JDBC

做开发不连接数据库怎么行!Spring整合JDBC过程中,数据源可以直接都在beans.xml里配置,也可以把数据单独放在一个properties文件里,方便维护。 首先放入各种jar包,连接MySQ...
  • u011731233
  • u011731233
  • 2015年07月26日 21:57
  • 1335

jdbc事务和事务的隔离级别

在jdbc的使用中以最简单的jdbc的使用为例,说明了jdbc的具体用法。然而在通常项目中,需要考虑更多内容,例如事务。 事务,在单个数据处理单元中,存在若干个数据处理,要么整体成功,要么整...
  • Crow_feiyu
  • Crow_feiyu
  • 2016年05月03日 16:37
  • 3499

JDBC ORACLE 数据库隔离级别

数据库的隔离级别: 于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 ...
  • cuigaochong
  • cuigaochong
  • 2015年08月26日 10:04
  • 891

JDBC事务隔离级别

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

JDBC事务隔离级别

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

JDBC及JDBC事务隔离级别

JDBC简介        JDBC是Java语言访问数据库的一种规范,一套规范的API接口。基于这些规范的接口和类,java程序员 可以访问不同类型的数据库,执行SQL语句进行数据库操作。     ...
  • kiritor
  • kiritor
  • 2013年09月30日 15:07
  • 2495

JDBC 事务隔离级别

JDBC 事务隔离级别 a:脏读取:一个事务读取了另外一个并行事务未提交的数据 b:不可重复读取:一个事务再次读取之前的数据时得到的数据不一致,被另外一个事务修改 c:虚读:一个事务重新执行一个...
  • u011588860
  • u011588860
  • 2016年06月22日 15:12
  • 164

jdbc事务隔离级别

五种分类 级别 名称 说明 1 TRANSACTION_NONE 不支持事务 2 TRANSACTION_READ_UNCOMMITTED 可读取其它...
  • kick5578
  • kick5578
  • 2013年03月15日 15:30
  • 677

MySQL数据库事务隔离级别(Transaction Isolation Level)及测试

MySQL数据库事务隔离级别(Transaction Isolation Level) 转自:http://blog.csdn.net/jiangwei0910410003/articl...
  • white_ice
  • white_ice
  • 2017年03月13日 10:43
  • 503

javaJDBC(4)-事务、隔离级别

 说明:这里列出了数据库操作的重要内容---事务,假设银行为了转账而对数据库操作,执行减钱成功了,但是加钱的时候出问题了,这就坏了。事务就是可以让多个动作都成功之后再生效,否则都不生效。 pa...
  • jiangheng0535
  • jiangheng0535
  • 2014年02月19日 16:00
  • 1365
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDBC事务隔离级别
举报原因:
原因补充:

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