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事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
Synchronized锁在Spring事务管理下,导致线程不安全。
spring 事务管理的理解
Spring事务管理(全),需要的可下载!
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
在该JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus,如下图所示: Spring事务管理的三个核心接口 5.1.1 事务管理的核心接口 1....
Spring事务管理4种方式 入门级 最简单demo PlatformTransactionManager TransactionTemplate
Spring事务管理中所需要的jar包是 spring-tx-3.2.0.RELEASE.jar
Spring 事务管理,Spring 事务管理,Spring 事务管理,Spring 事务管理
详细介绍Spring事务管理
此包含有所有Spring事务管理开发所需要的Jar包,包含框架、核心、表达式、日志、编译、事务切面aop、数据库连接、单元测试、框架文本等jar包。
Spring事务管理A方法内部调用B方法的回滚问题测试代码