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

spring的只读事务嵌套

    博客分类:
  • Java
阅读更多
spring的事务有只读与可写之分:
两者的根本区别就是只读事务所做的数据库修改不会提交到数据库.
需要注意2点:
1.HibernateTemplate的如下API检查了当前事务是否只读,如果是只读会抛出InvalidDataAccessApiUsageException异常:
save,update,saveOrUpdate,saveOrUpdateAll,replicate,persist,merge,delete,deleteAll
但是HibernateTemplate并未保证只读事务进行数据库写操作肯定抛出此异常,在只读事务中使用以上API之外的方法做数据库写操作就不会抛出异常,也不会提交到数据库.
2.如果只读事务中嵌套了另一个事务,且内嵌事务的级别设置为PROPAGATION_REQUIRED,则内嵌事务同样是只读的,不会真正提交,即便内层事务为非只读事务.
个人浅见,欢迎讨论.
分享到:
评论
1 楼 dizdev 2009-06-12  
我的观点

spring 本身不存在事务。 所谓spring事务只是一个非常透明的帮助类来处理一些初级程序员没有能力处理的工作,这样可以极大的掩盖程序的复杂性。其实spring tx是整个spring framework中最简单的module.

Readonly事务的特性是

事务资源不做任何事情,这样在一个有事务context的thread中,Readonly事务可以大大的优化事务,不需要去执行和监视 transaction对象的 Prepare(),commit(),abort()的回调函数。 更深层次的考虑是

1:在XA下,所有Read-Only的事务将直接转变为 1 阶段事务。
2:整个事务不会去Lock事务资源。事务资源可以自由释放,并且被其他thread引用。(这个是并发控制中,事务资源优化的主要手段)

所以楼主提到的HBTemplate的问题就会也能显然,由于spring tx 在特定情况下将一个tx设置为Read-Only,那么就不会触发commit的回调。因此,不会有任何异常抛出。

至于2:
在我的理解中,嵌套事务就是2个互不干扰的local tx进行一前一后的事务绑定。楼主所说的问题应该是spring使用了DefaultTransactionStatus这个类,而这个类的特性是在适当的时候将tx设置为Ready-Only来达到优化tx资源的目的。

以上是个人观点,欢迎讨论

相关推荐

    基于java的企业级应用开发:Spring事务管理概述.ppt

    TransactionDefinition接口定义了事务的规则,包括事务的名称、隔离级别、传播行为和超时时间,以及是否为只读事务。这些属性对事务的行为有直接影响: - `getName()`:返回事务的唯一标识。 - `...

    Spring 管理事务(传播特性、隔离级别、readonly).rar

    在只读事务中,数据库可能会对事务进行优化,例如跳过写日志等步骤,提高效率。当设置为true时,Spring不会提交任何更新操作,仅允许查询操作。这有助于避免在不应该修改数据的情况下误操作。 4. 实现方式: ...

    Spring框架+Spring中的事务

    在Spring框架中,`TransactionDefinition`接口定义了事务的属性,包括传播行为、隔离级别、超时时间以及是否为只读事务。这些属性共同决定了事务的行为特点。 - **getPropagationBehavior()**:返回事务的传播行为...

    全面分析 Spring 的编程式事务管理及声明式事务管理

    1. **TransactionDefinition**: 这个接口定义了事务的属性,如隔离级别、事务超时时间、是否只读等。通过TransactionDefinition,我们可以定制事务的行为。 2. **TransactionStatus**: 提供了事务的状态信息,如...

    spring事务

    - **只读事务**:设置事务为只读可以优化性能,因为数据库可以跳过某些锁定机制。 - **超时属性**:定义事务的最大执行时间,超时后事务将被回滚。 在实际开发中,根据业务需求和性能考虑,选择合适的事务管理...

    Spring3事务管理——使用@Transactional 注解.rar

    - 考虑使用`@Transactional(readOnly = true)`来标记只读事务,这样Spring可以优化事务处理,比如跳过回滚操作。 通过理解并熟练运用`@Transactional`注解,开发者可以更方便地管理和控制Spring应用中的事务,确保...

    spring注解式事务

    * readOnly:是否只读事务 * rollbackFor:抛出特定异常时回滚事务 * noRollbackFor:抛出特定异常时不回滚事务 * rollbackForClassName:抛出特定异常类名时回滚事务 * noRollbackForClassName:抛出特定异常类名时...

    Spring AOP管理Hibernate事务(TransactionInSpringAOP)

    这包括但不限于XML配置、Java配置、注解配置等不同方式,并且可能涵盖事务回滚、事务嵌套等复杂场景的处理。 总之,Spring AOP与Hibernate的集成使得事务管理变得简单,降低了代码的耦合度,提高了系统的可维护性。...

    Spring事务详解

    4. 事务的只读标志:由`isReadOnly()`返回,如果设置为true,事务管理器可能会对事务进行优化,例如避免写操作。 理解并合理配置这些事务属性,能够帮助开发者在多线程环境下更好地控制数据的完整性和一致性。在...

    Spring中事务

    - **PROPAGATION_NESTED**:Spring特有的,支持嵌套事务。 4. **readOnly事务属性** - **readOnly**:标记事务为只读,有助于优化事务处理,例如在ORM工具中避免脏检查。 5. **Timeout事务超时** - **timeout**...

    spring学习笔记事务的

    - **readOnly**:表示事务是否为只读事务,默认值为false。 - **timeout**:事务超时时间,单位为秒,默认值为-1,表示使用数据库的默认超时时间。 - **noRollbackFor**:用于指定不回滚的异常类型列表。 #### 三、...

    全面分析_Spring_的编程式事务管理及声明式事务管理

    - `PROPAGATION_NESTED`:如果当前存在事务,则创建一个嵌套事务;如果没有,则创建一个新的事务。 #### 总结 Spring的事务管理机制为开发者提供了强大的工具,无论是通过编程式还是声明式的方式,都能有效保证...

    Spring事务属性

    本文将详细解析Spring事务属性中的四个关键元素:事务隔离级别、事务传播行为、事务超时时间以及事务是否只读。 首先,我们来探讨事务隔离级别。事务隔离级别是解决并发事务可能导致的问题,如脏读、不可重复读和幻...

    Spring Boot的Spring事务处理机制4大特性.docx

    例如,某些只读操作不需要事务支持。 **4. PROPAGATION_NOT_SUPPORTED** - **定义**:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。 - **应用场景**:适用于那些不需要事务支持的操作,例如一些...

    Spring的编程式事务和声明式事务详解

    * TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED 事务超时 事务超时...

    S详细讲解SH中Spring事务流程.docx

    - `PROPAGATION_NESTED`:如果当前存在事务,则在一个嵌套事务中运行,否则行为类似`PROPAGATION_REQUIRED`。 6. **事务的隔离级别**: 除了传播行为外,事务还涉及隔离级别,如`ISOLATION_DEFAULT`、`ISOLATION_...

    spring 事务详解

    Spring 提供了多种不同的事务传播行为(Propagation),这些行为决定了当调用带有事务的方法时,如何处理嵌套方法的事务。以下是几种常见的传播行为: 1. **PROPAGATION_REQUIRED**: - **定义**:如果有事务存在...

    spring事务1

    只读事务只允许读取数据,不允许修改。 7. **声明式事务管理**:通过AOP(面向切面编程)实现,可以在方法执行前开启事务,执行后根据情况提交或回滚。Spring 提供了基于XML配置和基于注解的两种方式。其中,基于...

    Spring的7 种事务传播行为.pdf

    【Spring的7种事务传播行为】在Spring框架中,事务管理是核心功能之一,而事务传播行为则是控制事务如何在不同方法调用之间传播的重要机制。理解这些行为有助于确保应用程序的事务一致性,尤其是在多线程和分布式...

    spring学习文档

    TransactionDefinition 用于描述事务的隔离界别、超时时间、是否只读和传播规则等控制事务具体行为的事务属性。PlatformTransactionManager 是整个事务控制的核心类,它会根据 TransactionDefinition 定义的事务属性...

Global site tag (gtag.js) - Google Analytics