java 数据库 事务 只读_不使用事务和使用只读事务的区别
转转转,,还需要具体验证(
决定把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 数据库 事务 只读_不使用事务和使用只读事务的区别相关推荐
- 多数据源 事务管理_可能是最漂亮的Spring事务管理详解
事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用 ...
- mysql四种事务级别_【MySQL 知识】四种事务隔离级别
摘要:本篇文章主要是为了对MySQL的四种事务隔离级别的介绍.为了保证数据库的正确性与一致性,数据库事务具有原子性(Atomicity).一致性(Consistency).隔离性(Isolation) ...
- java数据库视图工具_数据库视图工具类
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- java 数据库改操作_数据库的插入、修改、删除操作(java实现)
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- java数据库的量级_程序员学Python还是Java?分析了8张图后得出这个结论
Java和Python两门语言都是目前非常热门的语言,可谓北乔峰南慕容,二者不分上下,棋逢对手.但是对于初学者来说,非常困惑,因为时间和精力有限,上手必须要先学一门,到底选那个好呢,今天3分钟带你透彻 ...
- sap事务代码_「SAP技术」SAP MM 事务代码ME17的用法
SAP MM 事务代码ME17的用法 1, 如下采购信息记录需要被归档: PIR号码,5300007816 2, ME12打上删除标记, 3, 事务代码ME17做归档 3.1 创建archive fi ...
- java数据库访问方式_纯java方式连接数据库简单操作
package com.beiwo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Result ...
- java数据库重要吗_我个人感觉数据库这方面对于程序员来说很重要,无论是对于JAVA程序员还是DOTNET程序员以及其他编程人员来说都是必须掌握的。为了帮助大家更好的来回顾T-SQL...
我个人感觉数据库这方面对于程序员来说很重要,无论是对于JAVA程序员还是DOTNET程序员以及其他编程人员来说都是必须掌握的.为了帮助大家更好的来回顾T-SQL,本人利用空闲的时间整理的一下T-SQL ...
- java 数据库的更新_更新了数据库[update ... set] java
我的java代码有问题 . 当我进行数据库更新但它们无法正常工作时 . 我使用了我在互联网上找到的三种方法,但仍然无法使用!请帮我提前谢谢你 package HLR_SERVEUR; public c ...
- java数据库的优化_用Java向数据库中插入大量数据时的优化
使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: public void ex ...
最新文章
- 开机f8修复电脑步骤_电脑无法启动,屏幕显示白色小横条,怎么办?可收藏以备不时之需...
- wireshare capture filter捕捉过滤的设置
- python设计一个验证用户密码程序出入小区卡_自助餐取菜顺利为_______。
- 淮海工学院计算机组成原理,淮海工学院1112-1计算机组成原理试卷A.doc
- 手机MODEM 开发(30)--- VoLTE无线功能
- 【yarn】INFO ipc.Client Retrying connect to server xxx 8032 Already tried 0 time(s)
- linux系统snmpd服务内存偏高,Red Hat Enterprise Linux 5.4 64位系统SNMP内存泄漏(上)
- 【pytorch】轻量级网络ShuffleNet_V2原理及完整实现,对照结构图手动编写
- java 图片渐变消失_透明背景图像与渐变
- 全网最细海龟 (turtle) 画图讲解 (三):设置画笔样式
- oracle stdevp函数,SQL Server与oracle两者区别之函数区别
- Multisim基础 交流电源AC的Voltage offset的含义
- 护眼灯护眼有效果吗?一文了解护眼灯到底有没有用
- MATLAB国产替代软件出现,这些学校已解决被禁用问题
- 初中计算机考试青岛多少分及格,详解青岛中考等级制成绩分五等按百分比划分...
- 用exec()函数执行新程序
- 回溯法,分支定界法求解n后问题
- UiBot RPA的全局变量设置
- 英汉计算机技术小词典,英汉计算机技术小词典
- 删除数组中的重复数内容
热门文章
- Java 将文件的内容复制到另一个文件
- C++ inline内联函数详解
- MySql数据类型介绍
- 倒计时小工具_送你3个倒数计日的小程序,让你不再遗忘重要事
- 集成学习之Adaboost(提升方法)
- ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?
- python递归调用详解_Python递归调用自己的函数
- highscore软件_软件|标准物质PDF卡片查找HighScore
- 傲云浏览器linux,Centos7安装部署zabbix监控软件
- mysql zrm_mysql数据库备份—ZRM