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

事务,JDBC,ORACLE

 
阅读更多
本文是在http://www.blogjava.net/William/archive/2006/06/30/56053.html的基础上整理的,并参考了http://www.builder.com.cn/2007/0907/495308.shtml这篇文章,再次感谢
 
事务
事务是数据库并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,以便保证数据完整性。
事务具有ACID特性:

(A)原子性

指的是事务中的整个活动序列必须被全部完成或全部放弃。事务不能部分地完成。与隔离性相结合后(见表1),原子性指的是任意一个事务将查看任何其他同时或以原子形式发生的事务所采取的所有活动。

(C)一致性

指的是事务既可以建立一个新的、有效的数据状态(在这种状态中可以进行所有的改动),它可以在操作失败的情况下,把所有的数据返回到事务发生之前已有的状态。

(I)隔离性

指在一个事务中发生的所有活动对其他事务来说都是不可见的,直到该事务被提交。

(D)持续性

指的是事务成功做出并提交的所有改动是不变的,并且必须克服系统故障。比如说,如果发生了故障或者系统重新启动,数据在最后提交事务之后所存在的状态下是可用的。

 

JDBC事务级别

JDBC事务级别分为5级:

(1)TRANSACTION_NONE

正式地讲,TRANSACTION_NONE不是一个有效的事务级别。根据java.sql.Connection API文件,这个级别表示事务是不被支持的,因此理论上说你不能使用TRANSACTION_NONE作为一个自变量赋给Connection.setTransactionIsolation()方法。

事实上,虽然一些数据库实施了这个事务级别,但是Oracle9i却没有实施。

(2)TRANSACTION_READ_UNCOMMITTED

这是最快的完全有效的事务级别。它允许你读取其他还没有被提交到数据库的并发事务做出的修改。这个API文件指出,脏读取(dirty reads)、不可重复读取(non-repeatable reads)和错误读取(phantom reads)都可以在这个事务级别发生(参阅" 一些非ACID事务问题 "部分)。这个级别意在支持ACID的"原子性(Atomic)"部分,在这个级别中,你的修改如果被提交,将被认为是同时发生的;如果被撤销,就被当作什么也没发生。

Oracle9i不支持这个级别。

(3)TRANSACTION_READ_COMMITTED

这是继TRANSACTION_READ_UNCOMMITTED之后最快的完全有效的级别。在此级别中,你可以读取已经被提交到数据库中的其他并发事务所做出的修改。API文件指出,脏读取在这个级别中是被禁止的,但是不可重复读取和错误读取都可以发生。

这个级别是Oracle9i默认的级别。

(4)TRANSACTION_REPEATABLE_READ

这个级别比TRANSACTION_SERIALIZABLE快,但是比其他的事务级别要慢。读取操作可以重复进行,这意味着两次读取同样的域应该总是得到同样的值,除非事务本身改变了这个值。API文件指出,脏读取和不可重复读取在这个事务级别中是被禁止的,但是错误读取可以发生。

从技术上讲,数据库通过在被读取或写入的行上加锁来实施这个级别,并且保持锁定状态直到事务结束。这就防止了这些行被修改或删除,但是不能防止额外的行被添加--因此,就可能产生错误读取。?????

Oracle9i不支持这个级别。

(5)TRANSACTION_SERIALIZABLE

这是最慢的事务级别,但是它完全与ACID兼容。"单词可串行化(serializable)"指的就是ACID兼容,其中你的事务被认为在整体上已经发生,就如同其他所有已提交的事务在这个事务之前或之后全部发生。换句话说,事务被串行执行。脏读取、不可重复读取和错误读取在TRANSACTION_SERIALIZABLE级别是全部被禁止的。

从技术上讲,数据库通过锁定在事务中使用的表来实施这个级别。???????

Oracle9i支持这个级别(正如每个与符合ACID的数据库那样)。

 

Oracl事务级别

Oracle支持的2种事务隔离级别:Read committedSerializable;

Isolation Level

Description

Read committed

This is the default transaction isolation level. Each query executed by a transaction sees only data that was committed before the query (not the transaction) began. An Oracle query never reads dirty (uncommitted) data.

Because Oracle does not prevent other transactions from modifying the data read by a query, that data can be changed by other transactions between two executions of the query. Thus, a transaction that runs a given query twice can experience both nonrepeatable read and phantoms.

默认的隔离级别设置。事务中的查询只能看到在此查询之前(而非事务开始之前)提交的数据。

由于Oracle不会因为查询数据而阻止另外一个事务修改数据,因此数据可以在一个事务中的 2 次查询中,查到不同的结果。因此可能出现 nonrepeatable read and phantoms 的情况。

Serializable

Serializable transactions see only those changes that were committed at the time the transaction began, plus those changes made by the transaction itself through INSERT , UPDATE , and DELETE statements. Serializable transactions do not experience nonrepeatable reads or phantoms.

Serializable transactions 只能查到此事务开始之前提交的数据,以及本次事务内部的INSERT,UPDATE,DELETE语句修改后的数据。因此能够做到没有nonrepeatable reads or phantoms的情况。 

以上 2 点都会保证不能脏读脏写,就是说不能得到另外一个事务修改没有提交的事务的修改后的数据。区别在于前者做不到nonrepeatable reads or phantoms,后者可以做到。

举例如下:

前提条件

有四个事务:事务A、事务B、事务C、事务D;

事务A:1个UPDATE操作;

事务B:3个操作,依次为SELECT-1、UPDATE、SELECT-2;

事务C:1个UPDATE操作;

事务D:1个UPDATE操作;

从时间前后来讲,事件顺序为:事务A的开始、事务A的UPDATE、事务B的开始、事务C的开始、事务D的开始、事务D的UPDATE、事务A的提交、事务B的SELECT-1、事务C的UPDATE、事务C的提交、事务B的UPDATE、事务B的SELECT-2、事务B的提交、事务D的提交;

结论:

如果事务B的事务隔离级别为Read committed

(1)事务B的SELECT-1能读到事务A的UPDATE后的数据吗?

可以。因为在SELECT-1之前事务A已经提交了。

(2)事务B的SELECT-1能读到事务B的UPDATE后的数据吗?

不能。虽然在同一个事务内,但是事务B的UPDATE是在SELECT-1之后。

(3)事务B的SELECT-1能读到事务C的UPDATE后的数据吗?

不能。因为这个时候这个时候事务C的UPDATE还没有进行。

(4)事务B的SELECT-1能读到事务D的UPDATE后的数据吗?

不能。因为事务D的UPDATE这个时候还没有提交。Read commited不会脏读。(如果读到了,即为脏读。)

(5)事务B的SELECT-2能读到事务A的UPDATE后的数据吗?

可以。因为在SELECT-2之前事务A已经提交了。

(6)事务B的SELECT-2能读到事务B的UPDATE后的数据吗?

可以。因为在同一个事务内部,而且UPDATE在前,SELECT-2在后。

(7)事务B的SELECT-2能读到事务C的UPDATE后的数据吗?

可以。因为Read commited会读到已经提交的事务内的修改,而事务C这个时候已经提交了。

(8)事务B的SELECT-2能读到事务D的UPDATE后的数据吗?

不能。因为事务D的UPDATE这个时候还没有提交。Read commited不会脏读。(如果读到了,即为脏读。)

如果事务B的事务隔离级别为Serializable

(1)事务B的SELECT-1能读到事务A的UPDATE后的数据吗?

不能。因为在事务B开始的时候事务A还没有提交。Serializable只能查到此事务开始之前提交的数据。

(2)事务B的SELECT-1能读到事务B的UPDATE后的数据吗?

不能。虽然在同一个事务内,但是事务B的UPDATE是在SELECT-1之后。

(3)事务B的SELECT-1能读到事务C的UPDATE后的数据吗?

不能。因为在事务B开始的时候事务C还没有开始。而且,事务C的UPDATE发生在事务B的SELECT-1之后。

(4)事务B的SELECT-1能读到事务D的UPDATE后的数据吗?

不能。因为事务D的UPDATE这个时候还没有提交。Serializable不会脏读。(如果读到了,即为脏读。)

(5)事务B的SELECT-2能读到事务A的UPDATE后的数据吗?

不能。因为在事务B开始的时候事务A还没有提交。Serializable只能查到此事务开始之前提交的数据。

(6)事务B的SELECT-2能读到事务B的UPDATE后的数据吗?

可以。Serializable可以查到本事物内部修改的数据。

(7)事务B的SELECT-2能读到事务C的UPDATE后的数据吗?

不能。因为在事务B开始的时候事务C还没有开始,更别说提交了。Serializable只能查到此事务开始之前提交的数据。

(8)事务B的SELECT-2能读到事务D的UPDATE后的数据吗?

不能。因为事务D的UPDATE这个时候还没有提交。Serializable不会脏读。(如果读到了,即为脏读。)

分享到:
评论

相关推荐

    jdbc oracle 10g

    JDBC驱动是连接Java应用程序和数据库的关键组件,对于Oracle 10g,我们需要的是Oracle JDBC驱动,通常称为ojdbc14.jar或更高版本。 安装Oracle JDBC驱动非常简单,只需将对应的jar文件添加到项目的类路径中。在Java...

    jdbc--drivers.zip_ jdbc oracle_JDBC ORACLE_oracle

    5. **事务处理**:在JDBC中,可以使用Connection对象的setAutoCommit()方法来控制事务,手动提交或回滚事务。 6. **性能优化**:通过使用PreparedStatement和批处理可以提高性能,避免SQL注入,并减少网络通信。 7...

    JDBC oracle 驱动程序包

    通过理解并正确使用JDBC驱动,Java开发者可以轻松地构建与Oracle数据库交互的应用程序,实现数据的增删改查和事务管理等功能。在实际开发中,还需要注意兼容性、性能优化、安全性和错误处理等方面的问题。

    java jdbc oracle代码

    总的来说,Java JDBC Oracle代码涵盖了数据库连接、SQL执行、结果处理和事务管理等关键环节,是Java开发人员必备的技能之一。理解并熟练运用这些概念,可以让你更有效地在Java应用中与Oracle数据库进行交互。

    Jdbc连接oracle远程数据库中文乱码解决

    本文将深入探讨如何通过JDBC(Java Database Connectivity)连接Oracle远程数据库时,解决中文乱码的困扰。 首先,我们需要理解的是,中文乱码通常源于字符集不一致或配置不当。在Java应用中,数据在JVM(Java...

    Oracle12C JDBC 驱动

    Oracle12C JDBC驱动还支持高级特性,如分布式事务处理、批量操作、预编译的SQL语句、游标、存储过程调用、连接池管理等。此外,通过`oracle.jdbc.pool.OracleDataSource` 类可以实现连接池功能,如使用Oracle的...

    oracle.jdbc.driver.oracledriver Oracle JDBC驱动包 ojdbc6

    Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...

    jdbcoracle(文件上传)

    这里我们关注的是`jdbcoracle(文件上传)`,这很可能是指使用JDBC(Java Database Connectivity)来操作Oracle数据库,并实现文件上传的功能。以下是对这个主题的详细阐述: JDBC是Java编程语言中用于与各种类型...

    jdbc oracle dirver.rar

    Oracle JDBC驱动还支持高级特性,如批量操作、事务控制、游标处理、存储过程调用、分布式事务等,使得Java开发者能够充分利用Oracle数据库的功能。 总的来说,"jdbc oracle dirver.rar"压缩包提供了连接Oracle...

    oracle12 jdbc驱动包

    此外,Oracle 12c JDBC驱动还支持高级特性,如分布式事务处理、JNDI查找、连接池管理、数据源支持、以及SQL的高级功能,如批量处理、存储过程调用、游标处理等。对于大型企业级应用,这些特性尤其重要,它们能确保...

    oracle jdbc jar包

    Oracle JDBC还支持高级特性,如批量更新、预编译的`PreparedStatement`、存储过程调用、游标处理、事务控制等。对于大型企业级应用,理解并熟练使用这些特性是至关重要的。 在开发过程中,注意管理和优化JDBC连接,...

    可用于oracle19c的jdbc驱动

    - **事务管理**:JDBC提供了对事务的控制,包括提交、回滚和隔离级别设置。 - **数据库元数据**:通过DatabaseMetaData接口,可以获取关于数据库的信息,如表结构、列信息等。 - **批处理**:通过Statement对象的...

    Oracle JDBC驱动11.2.0.4

    Oracle JDBC驱动程序允许Java应用程序通过Java代码与Oracle数据库进行交互,执行SQL查询、更新数据库记录以及管理事务等操作。在11g Release 2版本中,11.2.0.4是一个重要的维护版本,包含了一些性能优化、bug修复...

    oracle jdbc驱动包

    Oracle JDBC驱动包则是针对Oracle数据库实现的JDBC接口,提供了丰富的功能,如数据查询、事务处理、并发控制等。 在Oracle JDBC驱动包中,`ojdbc14.jar` 是一个关键的组件。它是Oracle JDBC Thin驱动程序的实现,也...

    Oracle12C驱动包JDBC

    Oracle 12C JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。JDBC(Java Database Connectivity)是Java平台的标准API,用于连接各种数据库,包括...

    oracle 11g jdbc jar包

    Oracle 11g JDBC Jar包是Oracle数据库与Java应用程序之间通信的重要桥梁,它包含了Oracle数据库JDBC驱动程序,使得开发者可以使用Java编程语言来访问和操作Oracle数据库。JDBC(Java Database Connectivity)是Java...

    使用jdbc_oracle实现的分页功能

    本示例着重讲解如何利用JDBC和Oracle数据库实现分页功能,同时涵盖一个表的基本操作:增加、删除和修改。 首先,我们需要了解JDBC。JDBC是Java API,它提供了一套标准接口,使得Java程序可以与各种类型的数据库进行...

    jdbc 源码 oracle 自带jdbc

    这份"jdbc源码,oracle自带jdbc"的资源对学习Java数据库开发的人员来说极其宝贵,因为它允许深入理解JDBC的工作原理以及Oracle驱动的实现细节。 首先,JDBC驱动分为四种类型:Type 1、Type 2、Type 3和Type 4。...

    Oracle 12C JDBC驱动 jar包 各版本驱动详解

    5. **JDBC URL参数**:根据需要,可以传递额外的URL参数来调整连接行为,如设置字符集、事务隔离级别等。 6. **性能优化**:使用PreparedStatement预编译SQL语句,以提高执行效率;考虑使用连接池管理数据库连接,...

    jdbc连接oracle简单示例

    7. **事务管理**:JDBC支持事务处理,可以使用`conn.setAutoCommit(false)`来手动控制事务的开始、提交和回滚。 8. **连接池**:在实际应用中,为了提高性能和减少资源消耗,通常会使用连接池(如C3P0、HikariCP等...

Global site tag (gtag.js) - Google Analytics