spring 提供了声明事务管理机制,在应用程序中可以让spring来统一管理事务,简化编程提高开发效率。
在这里以spring管理jpa事务为例
使用@PerstenceContext注解为应用注入实体管理器也就是EntityManager对象,简化的写一下代码,这样EntityManager对象就由容器来管理,在spring的配置文件中加入事务的配置,spring就可以管理应用的事务
@PerstenceContext
protected EntityManager em;
定义一个简单的service类(一般都把事务放在service层),使用注解配置事务
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
void saveGoods(Goods goods);
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
void removeGoods(Goods goods);
//查找方法不需要配置事务
Goods getGoodsById(int id);
/**
* 配置事务
*
*/
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
void updateGoods(Goods goods);
注意在Service层一定要加上@Transactional注解,否则无法向数据库更新或删除记录。因为从spring容器注入的EntityManager是开启事务的,不加这个注解,不会向数据库提交。
下面简单说下@Transactional属性
直接在一个方法上写@Transactional,属性默认值
propagation= propagation.REQUIRED
rollbackFor=RuntimeException.class
readonly=false
事务的传播特性
1 PROPAGATION_REQUIRED
没有事务就开启一个事务,有事务就不在开启新事务,比如UserService有a和b方法,两个方法加上了@Transactional(propagation= propagation.REQUIRED
),在a方法中调用b方法,在执行a方法时如果没有事务,就开启一个事务,如果已经存在事务则在事务中运行,在执行b方法时,发现已经开启事务,则在事务中执行,这样任何一个发生异常,事务就会回滚,保证数据的正确性,spring默认使用这种事务级别。
2 PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形 式运行。
3 PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。
4 PROPAGATION_REQUIRES_NEW
不管当前是否存在事务,都新创建一个事务,比如UserService有a和b方法,b方法加上了@Transactional(propagation= propagation.PROPAGATION_REQUIRES_NEW
),在a方法中调用b方法,如果a方法已经开启一个事务,在执行b方法时,a事务会被挂起,b方法新启动一个事务,b方法执行完,a方法事务恢复继续执行,这样a方法发生了异常,数据回滚,但b方法不会回滚,因为a和b方法不在同一个事务中运行。
5 PROPAGATION_NOT_SUPPORTED
以非事务方式执行,如果当前存在事务,就把当前事务挂起,以非事务方式执行。
6 PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常
readonly设置事务是否为只读事务
在jdbc中设置为true,说明这个事物是只读事物,不能执行更新删除操作,否则抛出异常,如果使用orm框架,则是一个优化提示,比如hibernate,则设置session的session的FlushModeType为FlushModeType.NEVER,这样hibernate就不会花费时间维护缓存与session缓存的数据同步,提高执行速度。个人认为,在查询方法中一般不用加事物,加上事物会增大开销。
rollbackFor
默认情况下,在程序抛出了运行时异常时,数据自动回滚,有时侯这样不满足要求,一般把这个属性值设置为Exception.class,出现异常事物就回滚。
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
Synchronized锁在Spring事务管理下,导致线程不安全。
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...
本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate。 1. **编程式事务管理**:这是一种手动控制事务的方式,通过在代码中调用`...
### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...
Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...
总的来说,Spring事务管理提供了一种灵活、强大的方式来处理应用程序中的事务,无论是在简单还是复杂的事务场景下,都能有效保证数据的一致性和完整性。通过声明式事务管理,开发者可以将关注点从事务细节中解脱出来...
Spring事务管理是Spring框架的核心特性之一,它提供了一种在Java应用中管理和协调数据库事务的标准方式。对于有Java基础的开发者来说,理解并掌握Spring事务管理至关重要,因为这有助于确保数据的一致性和完整性,...
当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...
### Spring事务管理的方法 #### 一、引言 在企业级应用开发中,事务管理是一项至关重要的技术。Spring框架作为Java领域中一个非常流行的轻量级框架,为开发者提供了多种方式来实现事务管理,其中主要分为编程式...