在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上@Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚:@Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务
还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。
(6) CompanyService.java
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.dao.CompanyDao;
import com.entry.TCompanyInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.dao.CompanyDao;
import com.entry.TCompanyInfo;
@Service("companyService")
@Transactional
@Transactional
public class CompanyService {
@Resource(name="companyDao")
private CompanyDao companyDao;
public void setCompanyDao(CompanyDao companyDao) {
this.companyDao = companyDao;
}
this.companyDao = companyDao;
}
public CompanyDao getCompanyDao() {
return companyDao;
}
@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor={Exception.class})//readOnly=true慎用(不可写事务)
public void test(TCompanyInfo tc){
try{
companyDao.createObj(tc);
String s=null;
s.length(); //假设会抛出NullPointerException,就会执行catch里的,如果不在catch里throw一个
return companyDao;
}
@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor={Exception.class})//readOnly=true慎用(不可写事务)
public void test(TCompanyInfo tc){
try{
companyDao.createObj(tc);
String s=null;
s.length(); //假设会抛出NullPointerException,就会执行catch里的,如果不在catch里throw一个
RuntimeException子类,依然不会rollback
}
catch(Exception e){
//throw new Exception("runtimeException");
System.out.println("exception");
throw new NumberFormatException("format exception"); //重抛一个Exception,才能rollback
}
}
}
}
catch(Exception e){
//throw new Exception("runtimeException");
System.out.println("exception");
throw new NumberFormatException("format exception"); //重抛一个Exception,才能rollback
}
}
}
在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子类),而checked exception(Exception及子类)是不会rollback的,除非你特别声明。
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})
因此所有在service层方法中用throws定义的Exception,都必须在事务定义中进行rollback设定。(请勿善忘)
所有在service层方法中被catch处理了的异常,又希望容器辅助rollback的话,必须重抛一个预定义的RuntimeException的子类。(请勿回望)
android入门实例:https://gitbook.cn/gitchat/activity/5d382e64b669c0566c335b32
相关推荐
NULL 博文链接:https://coolszy.iteye.com/blog/542717
spring使用注解进行事物管理例子,里面有说明.
Spring 与 各框架的组各下来,版本就特别的多,针对简单的 使用注解来管理事务的,研究了两天,要不网上写的不清楚,要不版本都很旧了,所以就是不回滚,Spring 的配置太灵活了,在加上新手,根本就不可能明白Spring...
本代码使用H2内存数据库演示spring事务使用,包括编程式事务,声明式事务@Transactional使用,自定义事务事务注解实现自定义事务管理器
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。spring注解事务实现demo
使用Spring注解方式管理事务与传播行为详解 24.使用Spring配置文件实现事务管理 25.搭建和配置Spring与Hibernate整合的环境 26.Spring集成的Hibernate编码与测试 27.Struts与Spring集成方案1(Struts集成Spring) ...
spring 事务基于注解模式
包含了spring事务的两种使用方式,xml和注解,有数据库
Spring事务管理教程,详细讲解了Spring中的事务管理,包括声明式事务,注解式事务,以及事务配置等等
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二.实验内容 (1)使用Spring JDBC实现书店的购书过程,即有如下一个BookShopDao接口,编写BookShopDaoImp类实现该接口中的...
spring3hibernate4注解式事务管理
spring注解的方式开启事务。开启事务,事务挂起,等等。
本文处理spring+mybatis,或springjdbc,对oracle事务不能提交的问题分析与解决
四,Spring基于注解的开发对应源代码,事务详解(概念重点),基于注解的事务控制,Spring集成JUnit
SpringJDBC注解事务.zip,SpringJDBC注解事务.zip
Spring+Hibernate注解声明式事务实例
本篇文章主要介绍了Spring 使用注解方式进行事务管理配置方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧