spring的事务有只读与可写之分:
两者的根本区别就是只读事务所做的数据库修改不会提交到数据库.
需要注意2点:
1.HibernateTemplate的如下API检查了当前事务是否只读,如果是只读会抛出InvalidDataAccessApiUsageException异常:
save,update,saveOrUpdate,saveOrUpdateAll,replicate,persist,merge,delete,deleteAll
但是HibernateTemplate并未保证只读事务进行数据库写操作肯定抛出此异常,在只读事务中使用以上API之外的方法做数据库写操作就不会抛出异常,也不会提交到数据库.
2.如果只读事务中嵌套了另一个事务,且内嵌事务的级别设置为PROPAGATION_REQUIRED,则内嵌事务同样是只读的,不会真正提交,即便内层事务为非只读事务.
个人浅见,欢迎讨论.
分享到:
相关推荐
TransactionDefinition接口定义了事务的规则,包括事务的名称、隔离级别、传播行为和超时时间,以及是否为只读事务。这些属性对事务的行为有直接影响: - `getName()`:返回事务的唯一标识。 - `...
在只读事务中,数据库可能会对事务进行优化,例如跳过写日志等步骤,提高效率。当设置为true时,Spring不会提交任何更新操作,仅允许查询操作。这有助于避免在不应该修改数据的情况下误操作。 4. 实现方式: ...
在Spring框架中,`TransactionDefinition`接口定义了事务的属性,包括传播行为、隔离级别、超时时间以及是否为只读事务。这些属性共同决定了事务的行为特点。 - **getPropagationBehavior()**:返回事务的传播行为...
1. **TransactionDefinition**: 这个接口定义了事务的属性,如隔离级别、事务超时时间、是否只读等。通过TransactionDefinition,我们可以定制事务的行为。 2. **TransactionStatus**: 提供了事务的状态信息,如...
- **只读事务**:设置事务为只读可以优化性能,因为数据库可以跳过某些锁定机制。 - **超时属性**:定义事务的最大执行时间,超时后事务将被回滚。 在实际开发中,根据业务需求和性能考虑,选择合适的事务管理...
- 考虑使用`@Transactional(readOnly = true)`来标记只读事务,这样Spring可以优化事务处理,比如跳过回滚操作。 通过理解并熟练运用`@Transactional`注解,开发者可以更方便地管理和控制Spring应用中的事务,确保...
* readOnly:是否只读事务 * rollbackFor:抛出特定异常时回滚事务 * noRollbackFor:抛出特定异常时不回滚事务 * rollbackForClassName:抛出特定异常类名时回滚事务 * noRollbackForClassName:抛出特定异常类名时...
这包括但不限于XML配置、Java配置、注解配置等不同方式,并且可能涵盖事务回滚、事务嵌套等复杂场景的处理。 总之,Spring AOP与Hibernate的集成使得事务管理变得简单,降低了代码的耦合度,提高了系统的可维护性。...
4. 事务的只读标志:由`isReadOnly()`返回,如果设置为true,事务管理器可能会对事务进行优化,例如避免写操作。 理解并合理配置这些事务属性,能够帮助开发者在多线程环境下更好地控制数据的完整性和一致性。在...
- **PROPAGATION_NESTED**:Spring特有的,支持嵌套事务。 4. **readOnly事务属性** - **readOnly**:标记事务为只读,有助于优化事务处理,例如在ORM工具中避免脏检查。 5. **Timeout事务超时** - **timeout**...
- **readOnly**:表示事务是否为只读事务,默认值为false。 - **timeout**:事务超时时间,单位为秒,默认值为-1,表示使用数据库的默认超时时间。 - **noRollbackFor**:用于指定不回滚的异常类型列表。 #### 三、...
本文将详细解析Spring事务属性中的四个关键元素:事务隔离级别、事务传播行为、事务超时时间以及事务是否只读。 首先,我们来探讨事务隔离级别。事务隔离级别是解决并发事务可能导致的问题,如脏读、不可重复读和幻...
例如,某些只读操作不需要事务支持。 **4. PROPAGATION_NOT_SUPPORTED** - **定义**:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。 - **应用场景**:适用于那些不需要事务支持的操作,例如一些...
* TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED 事务超时 事务超时...
- `PROPAGATION_NESTED`:如果当前存在事务,则在一个嵌套事务中运行,否则行为类似`PROPAGATION_REQUIRED`。 6. **事务的隔离级别**: 除了传播行为外,事务还涉及隔离级别,如`ISOLATION_DEFAULT`、`ISOLATION_...
Spring 提供了多种不同的事务传播行为(Propagation),这些行为决定了当调用带有事务的方法时,如何处理嵌套方法的事务。以下是几种常见的传播行为: 1. **PROPAGATION_REQUIRED**: - **定义**:如果有事务存在...
只读事务只允许读取数据,不允许修改。 7. **声明式事务管理**:通过AOP(面向切面编程)实现,可以在方法执行前开启事务,执行后根据情况提交或回滚。Spring 提供了基于XML配置和基于注解的两种方式。其中,基于...
【Spring的7种事务传播行为】在Spring框架中,事务管理是核心功能之一,而事务传播行为则是控制事务如何在不同方法调用之间传播的重要机制。理解这些行为有助于确保应用程序的事务一致性,尤其是在多线程和分布式...
TransactionDefinition 用于描述事务的隔离界别、超时时间、是否只读和传播规则等控制事务具体行为的事务属性。PlatformTransactionManager 是整个事务控制的核心类,它会根据 TransactionDefinition 定义的事务属性...