转转转,,还需要具体验证(

决定把readonly类型的事务完全去掉,以提高性能,这里有讨论:http://stackoverflow.com/questions/2562865/spring-transaction-readonly

)。。。

如果只提交一个查询,有必要用事务吗?这个问题之前已经讨论过

http://forum.javaeye.com/viewtopic.php?t=1603

但是并没有得出明确的结论。先让我们看看事务的定义:

引用:

Transactions are described in terms of ACID properties, which are as follows:

n Atomic: all changes to the database made in a transaction are rolled back if any

change fails.

n Consistent: the effects of a transaction take the database from one consistent

state to another consistent state.

n Isolated: the intermediate steps in a transaction are not visible to other users of

the database.

n Durable: when a transaction is completed (committed or rolled back), its effects

persist in the database.

即ACID的定义,从上面看来,似乎除了isolated之外,和只读查询都没有关系。那么是否只读查询不需要事务呢?

再看看Oracle对于只读事务的定义:

引用:

Read-Only Transactions

By default, Oracle guarantees statement-level read consistency. The set of data returned by a single query is consistent with respect to a single point in time. However, in some situations, you might also require transaction-level read consistency. This is the ability to run multiple queries within a single transaction, all of which are read-consistent with respect to the same point in time, so that queries in this transaction do not see the effects of intervening committed transactions.

If you want to run a number of queries against multiple tables and if you are not doing any updating, you prefer a read-only transaction. After indicating that your transaction is read-only, you can run as many queries as you like against any table, knowing that the results of each query are consistent with respect to the same point in time.

Oracle默认情况下保证了SQL语句级别的读一致性,即在该条SQL语句执行期间,它只会看到执行前点的数据状态,而不会看到执行期间数据被其他SQL改变的状态。

而Oracle的只读查询(read-only transaction)则保证了事务级别的读一致性,即在该事务范围内执行的多条SQL都只会看到执行前点的数据状态,而不会看到事务期间的任何被其他SQL改变的状态。

因此我们可以得出结论:

如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性;

如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持。

只读事务与读写事务区别

对于只读查询,可以指定事务类型为readonly,即只读事务。由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段,例如Oracle对于只读事务,不启动回滚段,不记录回滚log。

在JDBC中,指定只读事务的办法为:

connection.setReadOnly(true);

在Hibernate中,指定只读事务的办法为:

session.setFlushMode(FlushMode.NEVER);

此时,Hibernate也会为只读事务提供Session方面的一些优化手段

在Spring的Hibernate封装中,指定只读事务的办法为:

bean配置文件中,prop属性增加“readOnly”

我在MySQL4.1试验了一下,过程和结果如下:

数据库:MySQL4.1

表类型:InnoDB

Spring:1.1.2

Hibernate:2.1.7

使用Spring的声明式事务管理

试验过程如下:

不设置查询方法的事务类型(即不需要事务):访问查询页面,后台执行Spring的Bean方法,让 Hibernate发送select语句,然后手工在MySQL里面修改该记录某字段值,再访问查询页面,发现被修改过的字段值并没有变 化,Hibernate输出的log显示,数据库还是把老的字段值返回,而没有返回新的字段值。

设置查询方法的事务类型(只读事务):访问查询页面,后台执行Spring的Bean方法,让Hibernate发 送select语句,然后手工在MySQL里面修改该记录某字段值,再访问查询页面,发现被修改过的字段值已经变化,Hibernate输出的log显 示,数据库返回新的字段值。

这个试验说明,至少在MySQL4.1的InnoDB情况下,不使用只读事务的查询将无法读取到数据更新值,必须使用只读事务来保证读记录的数据一致性。这个结果非常令我诧异,和我预期完全两样。

我将在Oracle平台上试试看会有什么样的结果。

BTW: 如果MySQL的表类型改为MyISAM,那么即使不设置事务,也不会出现读数据不一致的现象。

oracle有两种方法保证在事务级读数据一致性(Transaction-Level Read Consistency)

一是用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ,

当执行这条命令后读数据时会产生一些重复copy, 你也可以做数据修改, 但在大量数据修改的情况下容易造成deadlock或异常, 用commit或rollback将把ISOLATION LEVEL设回为缺省模式read committed,

二是用SET TRANSCATION READ ONLY

当执行这条命令时数据库会生成一个快 照的latch, 这个latch会耗费一些resource, 如果你想进行数据修改会导致异常. 用commit或rollback会把latch释放掉, 也将把ISOLATION LEVEL设回为缺省模式read committed,

java 数据库 事务 只读_不使用事务和使用只读事务的区别相关推荐

  1. 多数据源 事务管理_可能是最漂亮的Spring事务管理详解

    事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用 ...

  2. mysql四种事务级别_【MySQL 知识】四种事务隔离级别

    摘要:本篇文章主要是为了对MySQL的四种事务隔离级别的介绍.为了保证数据库的正确性与一致性,数据库事务具有原子性(Atomicity).一致性(Consistency).隔离性(Isolation) ...

  3. java数据库视图工具_数据库视图工具类

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  4. java 数据库改操作_数据库的插入、修改、删除操作(java实现)

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  5. java数据库的量级_程序员学Python还是Java?分析了8张图后得出这个结论

    Java和Python两门语言都是目前非常热门的语言,可谓北乔峰南慕容,二者不分上下,棋逢对手.但是对于初学者来说,非常困惑,因为时间和精力有限,上手必须要先学一门,到底选那个好呢,今天3分钟带你透彻 ...

  6. sap事务代码_「SAP技术」SAP MM 事务代码ME17的用法

    SAP MM 事务代码ME17的用法 1, 如下采购信息记录需要被归档: PIR号码,5300007816 2, ME12打上删除标记, 3, 事务代码ME17做归档 3.1 创建archive fi ...

  7. java数据库访问方式_纯java方式连接数据库简单操作

    package com.beiwo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Result ...

  8. java数据库重要吗_我个人感觉数据库这方面对于程序员来说很重要,无论是对于JAVA程序员还是DOTNET程序员以及其他编程人员来说都是必须掌握的。为了帮助大家更好的来回顾T-SQL...

    我个人感觉数据库这方面对于程序员来说很重要,无论是对于JAVA程序员还是DOTNET程序员以及其他编程人员来说都是必须掌握的.为了帮助大家更好的来回顾T-SQL,本人利用空闲的时间整理的一下T-SQL ...

  9. java 数据库的更新_更新了数据库[update ... set] java

    我的java代码有问题 . 当我进行数据库更新但它们无法正常工作时 . 我使用了我在互联网上找到的三种方法,但仍然无法使用!请帮我提前谢谢你 package HLR_SERVEUR; public c ...

  10. java数据库的优化_用Java向数据库中插入大量数据时的优化

    使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: public void ex ...

最新文章

  1. 开机f8修复电脑步骤_电脑无法启动,屏幕显示白色小横条,怎么办?可收藏以备不时之需...
  2. wireshare capture filter捕捉过滤的设置
  3. python设计一个验证用户密码程序出入小区卡_自助餐取菜顺利为_______。
  4. 淮海工学院计算机组成原理,淮海工学院1112-1计算机组成原理试卷A.doc
  5. 手机MODEM 开发(30)--- VoLTE无线功能
  6. 【yarn】INFO ipc.Client Retrying connect to server xxx 8032 Already tried 0 time(s)
  7. linux系统snmpd服务内存偏高,Red Hat Enterprise Linux 5.4 64位系统SNMP内存泄漏(上)
  8. 【pytorch】轻量级网络ShuffleNet_V2原理及完整实现,对照结构图手动编写
  9. java 图片渐变消失_透明背景图像与渐变
  10. 全网最细海龟 (turtle) 画图讲解 (三):设置画笔样式
  11. oracle stdevp函数,SQL Server与oracle两者区别之函数区别
  12. Multisim基础 交流电源AC的Voltage offset的含义
  13. 护眼灯护眼有效果吗?一文了解护眼灯到底有没有用
  14. MATLAB国产替代软件出现,这些学校已解决被禁用问题
  15. 初中计算机考试青岛多少分及格,详解青岛中考等级制成绩分五等按百分比划分...
  16. 用exec()函数执行新程序
  17. 回溯法,分支定界法求解n后问题
  18. UiBot RPA的全局变量设置
  19. 英汉计算机技术小词典,英汉计算机技术小词典
  20. 删除数组中的重复数内容

热门文章

  1. Java 将文件的内容复制到另一个文件
  2. C++ inline内联函数详解
  3. MySql数据类型介绍
  4. 倒计时小工具_送你3个倒数计日的小程序,让你不再遗忘重要事
  5. 集成学习之Adaboost(提升方法)
  6. ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?
  7. python递归调用详解_Python递归调用自己的函数
  8. highscore软件_软件|标准物质PDF卡片查找HighScore
  9. 傲云浏览器linux,Centos7安装部署zabbix监控软件
  10. mysql zrm_mysql数据库备份—ZRM