`
san_yun
  • 浏览: 2599988 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

只读事务还是只读模式

    博客分类:
  • java
阅读更多
学习spring常常听说只读事务,到底什么是只读事务?
“只读事务”的提法太过笼统.只读事务可以分为两个方面:JDBC和数据库。

JDBC的Connection对象有一个方法setReadOnly。JDK的API描述如下:
Puts this connection in read-only mode as a hint to thedriver to enable 
database optimizations. 

翻译过来的意思“把此连接设置为只读模式,作为的数据库优化的暗示”.这里面有事务隔离吗?没有。甚至SUN的描述都很模糊,只是向数据库驱动做一个启动数据库优化的暗示,不代表一定有效。所以不应该把readOnly作为打开只读事务的判断。
robbin 在只读查询是否需要启动事务管理,兼论只读事务的说法并不十分正确:
robbin 写道

在JDBC中,指定只读事务的办法为:
connection.setReadOnly(true);

在Hibernate中,指定只读事务的办法为:
session.setFlushMode(FlushMode.NEVER);
此时,Hibernate也会为只读事务提供Session方面的一些优化手段

在Spring的Hibernate封装中,指定只读事务的办法为:
bean配置文件中,prop属性增加“readOnly”


查看oracle的文档对jdbc驱动的描述:
Transaction Isolation Levels and Access Modes
Read-only connections are supported by the Oracle server, but not by the 
Oracle JDBC drivers.

Oracle服务器支持Read-only ,这个又是什么意思呢?

为了搞清楚这个所谓的“只读事务”必须先明确一个概念--“事务隔离级别(transaction isolation degree)”,ANSI标准定义了4个隔离级别标准:
  • READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的。
  • READ COMMITTED:在一个事务中只允许已经commit的记录可见。如果session中select还在查询中,另一session此时insert一条记录,当前事务可以看到修改的记录,从而产生不可重复读取和幻像数据。
  • REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见,直到本事务commit或rollback。在一个事务中重复select的结果一样,除非本事务中update数据库。  
  • SERIALIZABLE:最高级别的隔离,只允许事务串行执行。为了达到此目的,数据库会锁住每行已经读取的记录,其他session不能修改数据直到前一事务结束,事务commit或取消时才释放锁。

主流数据库的一般的默认是READ COMMITTED级别。

MYSQL和MS SQLServer遵守了这个定义而oracle没有。oracle只有三种事务隔离等级:
  • Read committed
  • Serializable
  • Read-only Read-only transactions see only those changes that were committed at the time the transaction began and do not allow INSERT, UPDATE, and DELETE statements


前两个Read committed,Serializable 和ANSI的定义是一致的,来看看最关键的第三个Read-only 。Read-only事务只会看到在这个事务开启时间点其他事务提交过的数据,并且不允许执行INSERT, UPDATE,DELETE语句,换句话说,在设置set transaction read only后,当前会话所见的数据图像,将不再受到其他会话事务的影响。
所以oracle支持的只读事务不是为了优化性能,而是为了让这个事务中所有的查询操作看到的数据是一个时间点(开启事务)上的一致数据。MYSQL,SQL_SERVER根本没有只读事务的概念,但是有REPEATABLE READ,具体看之间的差别。


有了这个基础后,再看Connection对象也定义了五个变量和ANSI标准对应:

int TRANSACTION_NONE  =0;    //不受支持的事务
int TRANSACTION_READ_COMMITTED =1;
int TRANSACTION_READ_UNCOMMITTED = 2;
int TRANSACTION_REPEATABLE_READ = 4;
int TRANSACTION_SERIALIZABLE  =8;


而Spring也不过是在这上面做封装。TransactionDefinition接口中定义了五个不同的事务隔离级别:
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;


既然没有只读事务的概念,那么提交一个查询是否需要开启一个事务呢?
不同的数据库可能有不同实现,oracle驱动的文档介绍:
如果关闭Disabling Auto-Commit Mode可以提高一定的性能。
但是MYSQL好像相反,参见:http://www.iteye.com/topic/1603?page=1

4
1
分享到:
评论

相关推荐

    【分布式事务----LCN】LCN原理及使用方式.docx

    LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。 该模式的特点: - 该模式对代码...

    mysql事务处理用法与实例代码详解

    1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务、行级锁、并发 3.Berkeley DB:支持事务 一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整...

    Google Spanner–全球分布式数据库

    Spanner 是谷歌公司研发的、可扩展的、多版本、全球分布式、同步复制...这个 API 及其实现,对于支持外部一致性和许多强大特性而言,是非常重要的,这些强大特性包括:非阻塞的读、不采用锁机制的只读事务、原子模式变更。

    Google_Spanner中文版

    Spanner是谷歌公司研发的、可扩展的、多版本、全球分布式、同步复制...这个API及其实现,对于支持外部一致性和许多强大特性而言,是非常重要的,这些强大特性包括:非阻塞的读、不采用锁机制的只读事务、原子模式变更。

    基于Linux系统的sqlserver镜像模式(无见证)

    如果需要访问镜像数据库,可以通过快照方式只读访问。 相比SQL Server的MSCS群集对硬件的要求,SQL Server镜像服务是基于软件的高可用性解决方案。同SQL Server MSCS群集不同,SQL Server镜像服务主要特点如下: 1...

    基于Linux系统的sqlserver镜像模式(包含见证)

    如果需要访问镜像数据库,可以通过快照方式只读访问。 1、主体服务器,Principal:具有完整的数据副本,对外提供数据库读写服务,可以理解为主服务器。 2、镜像服务器,Mirror:具有完整的数据副本,本身不提供...

    尚硅谷佟刚Spring4代码及PPT.rar

    JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。

    sails-mysql-transactions:带有mySQL事务支持的sailswaterline ORM

    它还提供以负载平衡的方式从一组只读副本中进行读取的功能。安装将sails-mysql-transactions添加到应用程序的package.json 。 如果您的软件包中尚未安装sails请不要直接运行install。 如果您已经安装了sails-mysql ...

    Spring.html

    是否只读: 默认false TransactionManagerStatus: 事务的一些状态 整合 Spring整合Junit 1.导入依赖spring-test 2.加注解:RunWith、ContextConfiguration 3.注入对象进行测试 Spring整合web 1....

    read-only-cypher

    有时您希望将 Cypher 的使用限制为应用程序中的只读模式。 该项目提供了一种基于事务事件处理程序的方法。 这个怎么运作 使用 Neo4j 内核扩展初始化 TransactionEventHandler。 TransactionEventHandler 检查布尔 ...

    精通SQL 结构化查询语言详解

    18.5.2 设置只读事务(READ ONLY)  18.5.3 Oracle中的隔离级别  第19章 嵌入式SQL  19.1 SQL的调用  19.1.1 直接调用SQL 19.1.2 嵌入式SQL  19.1.3 SQL调用层接口(CLI)  19.2 嵌入式SQL的使用  ...

    ORACLE DBA 手册

    对只读类数据的设计规化 5 二、部署时调优 6 系统参数调整 6 调整LGWR 6 调整DBWR写进程 6 调整LGWR I/O 7 调整Dml_locks 8 调整Open_cursors 8 调整Data_links 8 调整系统进程数Processes 9 调整会话Sessions 9 ...

    cr0是系统内的控制寄存器之一

    但没有在文档中说明),cr2在处理器处于保护模式时存储上一个导致页故障的地址,cr3存储页目录的地址,cr4在Pentium系列(包括486的后期版本)处理器中才实现,它处理的事务包括诸如何时启用虚拟8086模式等。

    genji:面向文档的嵌入式SQL数据库

    源治 面向文档的嵌入式SQL数据库目录介绍 Genji是无模式数据库,允许对... 事务支持:默认情况下支持只读和读/写事务。 SQL和文档:Genji通过将强大SQL命令与JSON结合在一起,融合了两者的优点。 易于使用,易学:源

    benchmarksql:类似于TPC-C的测试工具

    5个不同的事务使用此模式,这些事务在表上产生各种不同的访问模式。 项目是只读的。 仓库,区域,客户和库存被读/写。 New-Order是插入,读取和删除的操作,就像在任何给定时间大约有W * 9000行的队列一样。 ...

    精通SQL--结构化查询语言详解

    13.5.1 oracle中用户、资源、概要文件、模式的概念 269 13.5.2 oracle中的用户管理 269 13.5.3 oracle中的资源管理 274 13.5.4 oracle中的权限管理 277 13.5.5 oracle中的角色管理 278 第14章 完整性控制 281 ...

    iBATIS实战

    9.6.1 高速缓存只读的长效数据 167 9.6.2 高速缓存可读写数据 169 9.6.3 高速缓存旧的静态数据 170 9.7 小结 172 第10章 iBATIS数据访问对象 173 10.1 隐藏实现细节 173 10.1.1 为何要分离 174 10.1.2 一个简单示例...

    SQL语法大全

    EditMode 只读 只读 只读 只读 EOF 只读 只读 只读 只读 Filter 可读写 可读写 可读写 可读写 LockType 可读写 可读写 可读写 可读写 MarshalOptions 可读写 可读写 可读写 可读写 MaxRecords 可读写 可读写 可读写 ...

    高频大数据解决方案.pptx

    关键特性: 基于网络的数据库集群复制 10 VoltDB包括一个网络复制Agent 这个Agent将事物异步从主集群(可读可写)复制到备集群(只读) 异步的方式最大限度容忍网络可能出现的问题 高频大数据解决方案全文共28页,...

Global site tag (gtag.js) - Google Analytics